一尘不染

为什么是“ &&”而不是“&”?

c#

为什么&&优于&||优于|

我问了一个已经编程多年的人,他的解释是:

例如,在中if (bool1 && bool2 && bool3) { /*DoSomething*/ }bool1必须先对in
进行测试bool2,然后再继续对进行测试,否则必须为true
bool3。等等。如果我只使用一个&,则即使他们都必须对前进到下一行,那为什么仍然重要呢?

注意:我想指出的是,我在编程上等同于蹒跚学步,这不是一个严重或紧急的问题。更多的是理解为什么应该以某种方式而不是另一种方式来完成事情。


阅读 356

收藏
2020-05-19

共1个答案

一尘不染

在大多数情况下,&&||优于&以及|因为前者短路,这意味着评估只要结果是明确取消。

例:

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。如果opnull,则表达式(op != null)的第一部分false求和为,其余部分(op.CanExecute())的求值被跳过。

除此之外,从技术上讲,它们是不同的,太:
&&||只能在使用bool,而&|可以在任何整型(可使用boolintlongsbyte,…),因为它们是位运算符。&
按位AND 运算符,|按位OR 运算符。

确切地说,在C#中,这些运算符(&|[和^])称为“逻辑运算符”(请参见C#规范第7.11章)。这些运算符有几种实现:

  1. 对于整数(intuintlongulong,章7.11.1):
    它们用于计算操作数和运算符的按位结果,即&是实现计算按位逻辑AND等。

  2. 对于枚举(第7.11.2章):
    实现它们以执行枚举的基础类型的逻辑运算。

  3. 对于布尔值和可为null的布尔值(第7.11.3和7.11.4章):
    不使用按位计算来计算结果。基本上基于两个操作数的值查找结果,因为可能性的数量非常小。
    由于两个值都用于查找,因此该实现方式不会造成短路。

2020-05-19