gpt4 book ai didi

c# - 为什么是 '&&' 而不是 '&' ?

转载 作者:IT王子 更新时间:2023-10-29 03:32:37 24 4
gpt4 key购买 nike

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

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

例如,在 if (bool1 && bool2 && bool3) {/*DoSomething*/} 中,bool1 必须为真才能测试 bool2 在继续 bool3 等之前必须为真。如果我使用单个 & 而不是测试,即使所有它们中的一部分必须为真才能进入下一行,所以为什么这很重要?

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

最佳答案

在大多数情况下,&&||&| 更受欢迎,因为前者很短-circuited,意味着一旦结果明确就取消评估。

例子:

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。如果您改用按位与运算符&,如果在字典中找不到该键,您将得到一个NullReferenceException,因为第二个在任何情况下都会执行部分表达式。​​

一个类似但更简单的示例是以下代码(如 TJHeuvel 所述):

if(op != null && op.CanExecute())
{
// Do Something
}

CanExecute 仅在 op 不为 null 时执行。如果 opnull,则表达式的第一部分 (op != null) 的计算结果为 false 并且跳过对其余 (op.CanExecute()) 的评估。

除此之外,从技术上讲,它们也不同:
&&|| 只能用于 bool&| 可以可用于任何整数类型(boolintlongsbyte、...),因为它们是按位运算符。 &按位与 运算符,|按位或 运算符。

准确地说,在 C# 中,这些运算符(&| [和 ^])被称为“逻辑运算符”(参见 C# spec,第 7.11 章)。这些运算符有多种实现方式:

  1. 对于整数(intuintlongulong,第 7.11.1 章):
    它们用于计算操作数和运算符的按位结果,即 & 用于计算按位逻辑 AND 等。
  2. 对于枚举(第 7.11.2 章):
    它们的实现是为了执行枚举的基础类型的逻辑操作。
  3. 对于 bool 值和可为空的 bool 值(第 7.11.3 和 7.11.4 章):
    结果不是使用按位计算来计算的。结果基本上是根据两个操作数的值查找的,因为可能性很小。
    因为这两个值都用于查找,所以此实现没有短路。

关于c# - 为什么是 '&&' 而不是 '&' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7331686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com