您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

例:

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章)。这些运算符有几种实现:

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

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

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

其他 2022/1/1 18:13:50 有557人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶