строка, возвращаемая функцией - PullRequest
4 голосов
/ 23 августа 2011

Если я напишу следующий код:

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 ]

2 голосов
/ 23 августа 2011

Вы МОЖЕТЕ сделать его более сложным и иметь значение 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; }
    }

Но еще раз, вы, вероятно, захотите синхронизировать это, если это многопоточное использование.

НО Это все ЕСЛИ вы хотите кэшировать значение, чтобы оно не перестраивалось каждый раз как ответственность самого класса.

Действительно, ваша самая простая и лучшая ставка - просто использовать второй метод, и если вы используете его несколько раз в одном методе, просто установите временную переменную и используйте ее.

1 голос
/ 23 августа 2011

Как альтернатива:

var firstString = myObj.GetString();
var myString  = string.Concat(firstString, firstString);

string.Concat уже управляет нулевым регистром (обрабатывая его как пустую строку).

0 голосов
/ 23 августа 2011

Попробуйте что-то вроде этого

public static void Main(string[] args) 
    {
        string s;
        if((s=getString())!=null) 
        {
            Console.WriteLine(s);
            Console.ReadLine();
        }
    }

    static string getString() 
    {
        return "hello";
    }
0 голосов
/ 23 августа 2011

Другой вариант - кэшировать результаты после первого вызова GetString. Затем последующие вызовы будут использовать кэшированную копию. Но то, как вы это делаете, подходит для большинства случаев и проще, чем реализация кеша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...