函数返回的字符串

时间:2011-08-23 13:59:12

标签: c# string

如果我写下面的代码:

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()中执行一次代码?

4 个答案:

答案 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";
    }