Будет ли это, если из-за провокации произойдут плохие вещи? - PullRequest
6 голосов
/ 24 июня 2010
int expenseCode;
if (int.TryParse(sourceRecord.ExpenseCode, out expenseCode) && _ExpenseCodeLookup.ContainsKey(expenseCode))
{
     destRow.PROFIT_CENTER_NAME = _ExpenseCodeLookup[expenseCode];
}
else
     destRow.PROFIT_CENTER_NAME = "Unknown";

Что меня беспокоит, так это то, что всегда будет выполняться первое выражение (установка expenseCode в процессе) перед второй операцией?

Ответы [ 3 ]

15 голосов
/ 24 июня 2010

Отлично. && является коротким замыканием в C #, и параметру out определенно будет присвоено соответствующее значение с помощью TryParse до вызова ContainsKey.

С другой стороны, вы можете использовать тот же трюк снова, чтобы получить значение:

string profitCenter;
int expenseCode;
if (int.TryParse(sourceRecord.ExpenseCode, out expenseCode) && 
    _ExpenseCodeLookup.TryGetValue(expenseCode, out profitCenter))
{
    destRow.PROFIT_CENTER_NAME = profitCenter;
}
else
{
    destRow.PROFIT_CENTER_NAME = "Unknown";
}

Таким образом, вы только один раз просматриваете код расхода.

6 голосов
/ 24 июня 2010

Нет, это не приведет к плохим вещам!

Оператор && гарантирует отсутствие оценки правого операнда, если левый операнд оценивается как ложный. Это называется коротким замыканием.

Аналогично, оператор || не будет вычислять правый операнд, если левый операнд оценивается как true.

Версии этих операторов без короткого замыкания для логических значений: & и |. Они будут оценивать оба операнда независимо от значения левой стороны.

3 голосов
/ 24 июня 2010

С утверждением все в порядке, && произойдет короткое замыкание, что означает, что правая сторона зависит от левой.Поэтому, если TryParse вернет true, тогда expenseCode будет заполнено действительным целым числом, а затем будет выполнена правильная функция.

...