如果我写下面的代码:
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()中执行一次代码?
答案 0 :(得分:2)
你可能会使它更复杂并具有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; }
}
但是再一次,如果它是多线程的,你可能想要同步它。
但是这就是 IF 你要缓存的价值所以每次都不会重建它作为类本身的责任。
真的,你最简单和最好的选择就是使用你的第二种方法,如果你在一种方法中多次使用它,只需设置一个临时变量并使用它。
答案 1 :(得分:1)
作为替代方案:
var firstString = myObj.GetString();
var myString = string.Concat(firstString, firstString);
string.Concat已经管理了null case(将其视为空字符串)。
答案 2 :(得分:0)
另一种选择是在第一次调用GetString后缓存结果。然后后续调用将使用缓存副本。但是,对于大多数情况而言,这样做的方式很好,并且比实现缓存更简单。
答案 3 :(得分:0)
尝试这样的事情
public static void Main(string[] args)
{
string s;
if((s=getString())!=null)
{
Console.WriteLine(s);
Console.ReadLine();
}
}
static string getString()
{
return "hello";
}