[英]string returned by function
如果我写下面的代码:
if(string.IsNullOrEmpy(myObj.GetString()))
{
var myString = myObj.GetString() + myObj.GetString();
}
我的函数GetString()将被调用3次,然后它可以执行3次复杂的代码。 有没有比以下更简单的方法:
var firstString = myObj.GetString();
if(!string.IsNullOrEmpy(firstString))
{
var myString = firstString + firstString;
}
在GetString()中只执行一次代码?
您可以使它更复杂并具有IsChanged bool值,如果对象更改中的任何内容将IsChanged设置为true然后重建字符串,否则返回构建的最后一个字符串,但是您需要添加同步并且它可能不会不值这笔钱。
所以,长期和短期是第二种情况通常是最好的情况。 它简单明了,高效。
更新 :很难说出更新方案在这里。 那么让我们看看几个。
1)。 如果您只是按需从应用程序更新字符串,并且使用某种复杂方法创建该字符串,则只需使用新的更新方法,然后将当前字符串作为属性返回。 然后,您可以只查询MyString属性,它将是一个简单的返回。
public class SomeClass
{
public string MyString { get; private set; }
public void UpdateString(...)
{
// DO YOUR COMPLEX LOGIC
MyString = ... new value ...
}
}
2)。 或者,如果它只是一个没有复杂逻辑的简单字符串,您可以让应用程序负责创建和分配它:
public class SomeClass
{
public string MyString { get; set; }
}
...
myObj.MyString = SomeComplexLogicToBuildString();
但正如我所说,只有当字符串表示独立于对象的状态时才会这样。
3)。 如果它基于对象的状态并在对象状态更改时发生更改,则可以在发生更改时重新创建字符串:
public class SomeClass
{
private bool _hasChanged = true;
private string _previousString = null;
public string MyString
{
get
{
if (_hasChanged)
{
_hasChanged = false;
_previousString = .... your complex string building logic ....
}
return _previousString;
}
}
public int OtherProperties
{
get { return _otherField; }
set { _otherField = value; _hasChanged = true; }
}
但是再一次,如果它是多线程使用的话,你可能想要同步它。
但是, 如果你想缓存这个值,那么每次都不会重建它作为类本身的责任。
确实,你最简单和最好的选择就是使用你的第二种方法,如果你在一种方法中多次使用它,只需设置一个临时变量并使用它。
作为备选:
var firstString = myObj.GetString();
var myString = string.Concat(firstString, firstString);
string.Concat已经管理了null case(将其视为空字符串)。
另一种选择是在第一次调用GetString后缓存结果。 然后后续调用将使用缓存副本。 但是,对于大多数情况而言,这样做的方式很好,并且比实现缓存更简单。
尝试这样的事情
public static void Main(string[] args)
{
string s;
if((s=getString())!=null)
{
Console.WriteLine(s);
Console.ReadLine();
}
}
static string getString()
{
return "hello";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.