为什么&&优于&和||优于|?
&&
&
||
|
我问了一个已经编程多年的人,他的解释是:
例如,在中if (bool1 && bool2 && bool3) { /*DoSomething*/ },bool1必须先对in 进行测试bool2,然后再继续对进行测试,否则必须为true bool3。等等。如果我只使用一个&,则即使他们都必须对前进到下一行,那为什么仍然重要呢?
if (bool1 && bool2 && bool3) { /*DoSomething*/ }
bool1
bool2
bool3
注意:我想指出的是,我在编程上等同于蹒跚学步,这不是一个严重或紧急的问题。更多的是理解为什么应该以某种方式而不是另一种方式来完成事情。
在大多数情况下,&&并||优于&以及|因为前者短路,这意味着评估只要结果是明确取消。
例:
if(CanExecute() && CanSave()) { }
如果CanExecute返回false,则完整表达式将是false,而不考虑的返回值CanSave。因此,CanSave不执行。
CanExecute
false
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 ,因为无论如何都要执行表达式的第二部分。
TryGetValue``false
value.Contains("test")
TryGetValue
true
value
null
NullReferenceException
下面是一个类似但更简单的示例代码(如TJHeuvel所述):
if(op != null && op.CanExecute()) { // Do Something }
CanExecute仅在op不是时执行null。如果op为null,则表达式(op != null)的第一部分false求和为,其余部分(op.CanExecute())的求值被跳过。
op
op != null
op.CanExecute()
除此之外,从技术上讲,它们是不同的,太: &&和||只能在使用bool,而&并|可以在任何整型(可使用bool,int,long,sbyte,…),因为它们是位运算符。&是 按位AND 运算符,|是 按位OR 运算符。
bool
int
long
sbyte
确切地说,在C#中,这些运算符(&,|[和^])称为“逻辑运算符”(请参见C#规范第7.11章)。这些运算符有几种实现:
^
对于整数(int,uint,long和ulong,章7.11.1): 它们用于计算操作数和运算符的按位结果,即&是实现计算按位逻辑AND等。
uint
ulong
AND
对于枚举(第7.11.2章): 实现它们以执行枚举的基础类型的逻辑运算。
对于布尔值和可为null的布尔值(第7.11.3和7.11.4章): 不使用按位计算来计算结果。基本上基于两个操作数的值查找结果,因为可能性的数量非常小。 由于两个值都用于查找,因此该实现方式不会造成短路。