这个if语句会导致不好的事情发生吗?

时间:2010-06-23 20:17:53

标签: c# if-statement operator-precedence

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)?

3 个答案:

答案 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将填充有效整数,然后执行正确的函数。