在大多数情况下,
&&并
||优于
&以及
|因为前者短路,这意味着评估只要结果是明确取消。
例:
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章):
不使用按位计算来计算结果。基本上基于两个操作数的值查找结果,因为可能性的数量非常小。
由于两个值都用于查找,因此该实现方式不会造成短路。



