在大多数情况下,&&
并||
优于&
以及|
因为前者短路,这意味着评估只要结果是明确取消。
例:
if(CanExecute() && CanSave())
{
}
如果CanExecute
返回false
,则完整表达式将是false
,而不考虑的返回值CanSave
。因此,CanSave
不执行。
在以下情况下这非常方便:
string value;
if(dict.TryGetValue(key, out value) && value.Contains("test"))
{
// Do Something
}
TryGetValue``false
如果在字典中找不到提供的键,则返回。由于的短路特性&&
,value.Contains("test")
仅在TryGetValue
返回时执行,true
因此value
不是null
。如果改用按位AND 运算符&
,NullReferenceException
则在字典中找不到键时将得到一个a ,因为无论如何都要执行表达式的第二部分。
下面是一个类似但更简单的示例代码(如TJHeuvel所述):
if(op != null && op.CanExecute())
{
// Do Something
}
CanExecute
仅在op
不是时执行null
。如果op
为null
,则表达式(op != null
)的第一部分false
求和为,其余部分(op.CanExecute()
)的求值被跳过。
除此之外,从技术上讲,它们是不同的,太:&&
和||
只能在使用bool
,而&
并|
可以在任何整型(可使用bool
,int
,long
,sbyte
,…),因为它们是位运算符。&
是按位AND 运算符,|
是 按位OR 运算符。
确切地说,在C#中,这些运算符(&
,|
[和^
])称为“逻辑运算符”(请参见C#规范第7.11章)。这些运算符有几种实现:
对于整数(int
,uint
,long
和ulong
,章7.11.1): 它们用于计算操作数和运算符的按位结果,即&
是实现计算按位逻辑AND
等。
对于枚举(第7.11.2章): 实现它们以执行枚举的基础类型的逻辑运算。
对于布尔值和可为null的布尔值(第7.11.3和7.11.4章): 不使用按位计算来计算结果。基本上基于两个操作数的值查找结果,因为可能性的数量非常小。 由于两个值都用于查找,因此该实现方式不会造成短路。