代码之家  ›  专栏  ›  技术社区  ›  Scott Chamberlain

如果停止会导致坏的事情发生,这会发生吗?

  •  6
  • Scott Chamberlain  · 技术社区  · 15 年前
    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 回复  |  直到 15 年前
        1
  •  15
  •   Jon Skeet    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";
    }
    

    这样,您只需查找一次支出代码。

        2
  •  6
  •   Mehrdad Afshari    15 年前

    不,这不会导致坏事发生!

    这个 && 如果左操作数的计算结果为假,则运算符保证不计算右操作数。这叫做短路。

    同样地, || 如果左操作数的计算结果为真,则运算符将不计算右操作数。

    布尔值的这些运算符的非短路版本为 & | . 它们将计算两个操作数,而不考虑左侧的值。

        3
  •  3
  •   Anthony Pegram    15 年前

    声明很好, && 会短路,这意味着右侧取决于左侧。所以如果 TryParse 返回真,然后 expenseCode 将填充一个有效的整数,然后执行正确的函数。

    推荐文章