6

我读到&&.NET 中的 AND 运算符有条件地评估其第二个参数。

检查 null 然后检查单个语句中的某些字段是否安全?

例如,假设我们有一个类 SomeClass,它有一个整数字段 Id:

class SomeClass
{
   public Int32 Id { get; set; }
}

然后,我们在某处接收到这种类型的对象并尝试对其执行一些操作:

public void SomeMethod(SomeClass obj)
{
   if (obj != null)
      if (obj.Id == 1)
      {
         // do some actions
      }
}

我们可以将其重写如下以减少代码量吗?空检查会安全吗?

public void SomeMethod(SomeClass obj)
{
   if (obj != null && obj.Id == 1)
      // do some actions
}
4

5 回答 5

7

是的,这将是安全的,&& 条件从“左到右”处理,如果第一个与您的情况不匹配,则不会评估第二个

微软

操作

x && y

对应操作

x 和 y

除了如果 x 为假,则不计算 y,因为无论 y 的值是多少,AND 运算的结果都是假的。这称为“短路”评估。

于 2012-10-12T09:27:35.247 回答
3

是的,这样做绝对安全。

正如您在问题中所述,如果对象为空,则仅评估第一个条件,因此永远不会执行第二个条件(会引发 NullReferenceException)。这也称为“短路”评估。

于 2012-10-12T09:27:30.687 回答
1

是的...这在 C# 和许多其他语言中是安全的。如果程序知道以下检查不能使整个 if 语句变为真,则甚至无需查看它们。

这种类型的评估称为惰性评估

于 2012-10-12T09:29:55.850 回答
1

这里的术语是“短路”。使用 and(&&)运算符,如果第一个条件失败,则不会继续下一个条件。他们的做法不仅是保存,而且是正确的做法。

7.11 条件逻辑运算符 - C# 参考 MSDN

&& 和 || 运算符称为条件逻辑运算符。它们也被称为“短路”逻辑运算符。

于 2012-10-12T09:29:56.643 回答
1

是的,这就是简单的逻辑,如果在几个 AND 语句中,一个为假,则无需继续评估它们,因为结果将为 FALSE,因此编译器在找到第一个 FALSE 时停止评估

于 2012-10-12T09:30:34.390 回答