2010-06-23 4 views
6
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 в процессе) перед второй операцией?Будет ли это, если положение дел приведет к тому, что произойдут плохие вещи?

ответ

15

Это прекрасно. && является короткозамкнутым в 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"; 
} 

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

+0

Спасибо за подсказку на TryGetValue! –

6

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

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

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

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

3

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