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

私が懸念しているのは、最初の式は常にexpenseCode2番目の操作の前に実行(プロセスで設定)されるのでしょうか?

4

3 に答える 3

15

それはいいです。&&はC#で短絡しており、パラメータは、が呼び出される前にout適切な値が確実に割り当てられています。TryParseContainsKey

一方、同じトリックをもう一度使用して値をフェッチすることもできます。

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

このようにして、経費コードのルックアップを1回だけ実行します。

于 2010-06-23T20:19:31.513 に答える
6

いいえ、悪いことが起こることはありません!

演算子は&&、左のオペランドがfalseと評価された場合に、右のオペランドを評価しないことを保証します。これは短絡と呼ばれます。

同様に、||左側のオペランドがtrueと評価された場合、演算子は右側のオペランドを評価しません。

ブール値に対するこれらの演算子の非短絡バージョンは&、および|です。左側の値に関係なく、両方のオペランドを評価します。

于 2010-06-23T20:19:24.517 に答える
3

ステートメントは問題なく、&&短絡します。つまり、右側が左側に依存します。したがって、TryParsetrueを返すexpenseCodeと、有効な整数が入力され、適切な関数が実行されます。

于 2010-06-23T20:20:13.943 に答える