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
)?
答案 0 :(得分: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";
}
这样你只需要查看费用代码一次。
答案 1 :(得分:6)
不,它不会导致坏事发生!
如果左操作数的计算结果为false,则&&
运算符保证不评估右操作数。这称为短路。
同样,如果左操作数的计算结果为true,||
运算符将不会计算右操作数。
这些运算符的非短路版本的布尔值为&
和|
。无论左侧的值如何,它们都将评估两个操作数。
答案 2 :(得分:3)
声明很好,&&
会短路,这意味着右手边依赖于左边。因此,如果TryParse
返回true,则expenseCode
将填充有效整数,然后执行正确的函数。