C# 是否有一个时间&&;(AndAlso)也不重要&;(及)

C# 是否有一个时间&&;(AndAlso)也不重要&;(及),c#,boolean-logic,C#,Boolean Logic,如果我在计算两个变量而不是两个方法调用,那么使用“&&”或“&”是否重要 此外,我在C#3.0/.NET 3.5中使用的一本书只提到了&&运算符,&&运算符是否消失了?如果您正在执行真/假逻辑测试,请始终使用&&。单个&执行位智能的“和”。在某些情况下,它可以像逻辑测试一样工作,但不能保证在所有逻辑情况下都能工作。单个&的最常用用法是在应用位掩码时 示例(&&): 示例(&): &是位运算符,&&是AND运算符。两个完全不同的操作 int a = 1; int b = 2; assert (a

如果我在计算两个变量而不是两个方法调用,那么使用“&&”或“&”是否重要


此外,我在C#3.0/.NET 3.5中使用的一本书只提到了&&运算符,&&运算符是否消失了?

如果您正在执行真/假逻辑测试,请始终使用&&。单个&执行位智能的“和”。在某些情况下,它可以像逻辑测试一样工作,但不能保证在所有逻辑情况下都能工作。单个&的最常用用法是在应用位掩码时

示例(&&):

示例(&):


&是位运算符,&&是AND运算符。两个完全不同的操作

int a = 1;
int b = 2;
assert (a & b == 0) 
assert (a && b == true) 
编辑:Ooops…此示例在C#中不起作用。它应该在C++中。希望它能说明这两个运算符之间的意图和区别。

如果使用单个&(and)表达式的第二部分将被计算。如果第二部分依赖于第一部分为真,这可能是不好的。通常总是使用&&因为如果第一部分为false,则不计算第二部分

从逻辑上讲,single&会像其他人所说的那样执行位运算,这对于布尔比较/求值仍然有效。实际上,唯一应该使用单个&(或|)的时间(或布尔求值)是第二个求值是否应该始终运行(如果它是函数调用/修改器)。这是一种糟糕的做法,可能也是书中没有提及的原因

单&与标志枚举和位掩码一起使用很有用

以下内容将引发obj为null的异常:

bool b = obj != null & obj.IsActive
但这将起作用:

bool b = obj != null && obj.IsActive
这很糟糕:

bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);

&运算符在此保留。

正如所观察到的,
&
是按位AND运算符。随着时间的推移,原始二进制数学似乎越来越不常见,越来越多的开发人员并不真正理解逐位算术。这有时会让人痛苦

然而,有很多任务都可以用这样的方法来解决,特别是任何将数据视为标志的方法。
&
运算符是100%必需的,并且不会去任何地方-它只是不像布尔短路
&
运算符那样频繁使用

例如:

[Flags]
enum SomeEnum { // formatted for space...
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ...
}
static void Main() {
    SomeEnum value = GetFlags();
    bool hasFoo = (value & SomeEnum.Foo) != 0;
}
static SomeEnum GetFlags() { ... }

我试过了,编译器抱怨说:运算符“&”不能应用于“int”和“bool”类型的操作数,这是因为int不是8位值。您需要将字节强制转换为int才能使其正常工作。请尝试以下操作(运算符优先级受到阻碍):assert((a&b)==0)
bool b = obj != null && obj.IsActive
bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);
[Flags]
enum SomeEnum { // formatted for space...
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ...
}
static void Main() {
    SomeEnum value = GetFlags();
    bool hasFoo = (value & SomeEnum.Foo) != 0;
}
static SomeEnum GetFlags() { ... }