2012-10-12 48 views
6

我读到NET中的AND运算符&&有条件地评估其第二个参数。带空检查的C#AND运算符

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

例如,假设我们有一个类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 
} 

回答

7

是的,它是安全的,& &条件从“左到右”处理,如果先在你的情况不匹配,第二个将不被计算

msdn

操作

X & &ý

对应于邻peration

X &Ÿ

只是如果x是假的,Y不评价,因为 与操作的结果为假不管是什么y的值。这是 被称为“短路”评估。

3

是的,这是绝对安全的。

正如你在你的问题中所述,如果对象为空,只有第一个条件被评估,所以第二个条件(会引发NullReferenceException)永远不会执行。这也被称为“短路”评估。

1

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

这种类型的评估被称为Lazy Evaluation

1

没错,这就是简单的逻辑,如果在几个与statments,一个是假的,也没有必要继续进行评价,因为结果会是假的,所以编译器停止评估,当第一FALSE发现