有没有时间&&(AndAlso)无关紧要&(和)

Bob*_*ich 8 c# boolean-logic

如果我正在评估两个变量,而不是两个方法调用,那么天气问题我使用"&&"或"&"

//some logic that sets bool values

boolean X = true;
boolean Y = true;

if (X & Y){
   // perform some operation
}

if (X && Y){
   // perform some operation
}
Run Code Online (Sandbox Code Playgroud)

另外我用于C#3.0/.NET 3.5的书只引用了&&运算符,&运算符会消失吗?

vfi*_*lby 9

如果您正在执行真/假逻辑测试,请始终使用&&.一个单一的&执行一点'和'.在某些情况下,它会像逻辑测试一样工作,但不能保证适用于所有逻辑案例.单个&的最常见用法是在应用位掩码时.

例子 (&&):

true && true == true
Run Code Online (Sandbox Code Playgroud)

示例(&):

00101001 & 00100001 = 00100001
Run Code Online (Sandbox Code Playgroud)


Rob*_*ner 7

如果使用单个&(和),则评估表达式的第二部分.如果第二部分依赖于第一部分是真的,这可能是不好的.通常总是使用&&,因为如果第一部分是假的,则不评估第二部分.

逻辑上单个&执行按位操作,正如其他人所说,这对于布尔比较/评估仍然有效.实际上唯一一次使用单个&(或|)(或布尔评估)是第二次评估应该始终运行(如果它是一个函数调用/修饰符).这是不好的做法,也可能是为什么这本书没有提到它.

单个&对标志枚举和位掩码很有用.

以下将抛出obj为null的异常:

bool b = obj != null & obj.IsActive
Run Code Online (Sandbox Code Playgroud)

但这会奏效:

bool b = obj != null && obj.IsActive
Run Code Online (Sandbox Code Playgroud)

这是不好的:

bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);
Run Code Online (Sandbox Code Playgroud)

&运营商将留在这里.


Mar*_*ell 3

正如所观察到的,&是按位 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() { ... }
Run Code Online (Sandbox Code Playgroud)