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 설정)?statment가 나쁜 일을 일으키는 원인이 될 것입니까?

답변

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로 평가되면 오른쪽 피연산자를 평가하지 않습니다. 이것을 단락이라고합니다.

마찬가지로 왼쪽 피연산자가 true로 평가되면 || 연산자는 오른쪽 피연산자를 계산하지 않습니다.

부울 값에 대한 이러한 연산자의 비 단락 버전은 &|입니다. 그들은 왼쪽의 값에 관계없이 두 피연산자를 모두 평가할 것입니다.

3

성명은 괜찮습니다. &&은 단락합니다. 즉, 오른쪽이 오른쪽을 향하고 있음을 의미합니다. 따라서 TryParse이 true를 반환하면 expenseCode에 유효한 정수가 채워지고 올바른 함수가 실행됩니다.

관련 문제