2010-06-23 6 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"; 

Die Sache, über die ich gesprochen habe, ist, wird der erste Ausdruck immer ausgeführt (Einstellung expenseCode im Prozess) vor der zweiten Operation?Wird dies dazu führen, dass schlechte Dinge passieren?

Antwort

15

Das ist in Ordnung. && ist in C# kurzgeschlossen, und der out Parameter wird definitiv den entsprechenden Wert von TryParse zugewiesen, bevor ContainsKey aufgerufen wird.

Auf der anderen Seite, können Sie den gleichen Trick verwenden wieder den Wert zu holen:

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

Auf diese Weise Sie einmal, um die Suche nach dem Kosten-Code nur tun.

+0

Danke für den Tipp auf dem TryGetValue! –

6

Nein, es wird keine schlechten Dinge passieren!

Der Operator && garantiert, dass der rechte Operand nicht ausgewertet wird, wenn der linke Operand als false ausgewertet wird. Dies wird als Kurzschluss bezeichnet. Der Operator || wertet den rechten Operanden nicht aus, wenn der linke Operand true ergibt.

Die nicht kurzschließenden Versionen dieser Operatoren für boolesche Werte sind & und |. Sie werten beide Operanden unabhängig vom Wert der linken Seite aus.

3

Die Aussage ist in Ordnung, && wird kurzschließen, was bedeutet, dass die rechte Seite von links abhängig ist. Wenn also TryParse Wahr zurückgibt, dann wird expenseCode mit einer gültigen Ganzzahl aufgefüllt, und dann wird die richtige Funktion ausgeführt.

Verwandte Themen