我看到了这个:
bool Isvalid = isValid & CheckSomething()
bool Isvalid = isValid && CheckSomething()
第二种情况可能是一个短路的场景。
那么我们不能总是只使用 &
而不是 &&
吗?
我看到了这个:
bool Isvalid = isValid & CheckSomething()
bool Isvalid = isValid && CheckSomething()
第二种情况可能是一个短路的场景。
那么我们不能总是只使用 &
而不是 &&
吗?
&
是按位 AND,意味着它在位级别上起作用。 &&
是逻辑 AND,意味着它在布尔(true/false)级别上工作。逻辑 AND 使用短路(如果第一部分为 false,则没有必要检查第二部分)来防止运行多余的代码,而按位 AND 需要操作每个位来确定结果。
你应该使用逻辑 AND (&&
) ,因为这是你想要的,而 &
可能会产生错误的结果。但是,如果您想评估其副作用,则需要单独运行第二种方法:
var check = CheckSomething();
bool IsValid = isValid && check;
&&
版本具有短路运算的特性。 - LukeH&
,则无论 isValid
的值如何,CheckSomething
都将始终被调用。如果您使用 &&
,则仅在 isValid
为 true 时才会调用 CheckSomething
。表达式本身的结果应该是相同的,无论您使用 &
还是 &&
。(由您决定需要在什么情况下调用 CheckSomething
。) - LukeH&
作为位运算符,但是在C#中,只有在应用于整数值时才将其用作位运算符,但对于布尔值,它将不起作用作为位运算符,而是作为逻辑AND运算符,评估两个操作数。请参见此链接。adjan
的答案应该被标记为正确答案。 - HawkeyeC#有两种逻辑合取(AND)运算符适用于bool
类型:
x & y
逻辑 AND 运算符
x
和y
都为true
时,结果才为true
x
和y
进行求值。x && y
条件逻辑 AND 运算符
x
和y
都为true
时,结果才为true
x
进行求值,如果x
求值为false
,则立即返回false
而不评估y
(短路计算)。因此,如果您依赖于对x
和y
的同时求值,可以使用&
运算符,但它很少被使用并且很难阅读,因为副作用并不总是对读者清晰。
注意:对于整数类型(int
、long
等),也存在二进制&
运算符,它执行按位逻辑 AND 运算。
var bob = true; var bob2 = true; var bob3 = bob & bob2;
在许多CPU上,该示例中的&
比&&
更快。 - mjwills我相信你漏掉了一些东西。在第二种情况中,如果isValid为假,则不会评估CheckSomething。
条件与运算符(&&)对其bool操作数执行逻辑AND运算,但仅在必要时评估其第二个操作数。
http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx
Flags
属性时)。欲了解更多信息,请搜索“枚举位和运算符”。 - Martijn
&
(或者通常情况下具有副作用的表达式); 我只是在展示这两个运算符之间的区别!(顺便说一句,&
和&&
之间的区别并不是C#中的一个隐藏特性,它在我所知道的所有类C语言中都很常见。如果维护你的系统的人不知道这个区别,那么他们需要尽快接受一些培训。) - LukeH&&
。很难给出比这更好的答案。这两个运算符都是语言的特性,有其存在的理由。没有人可以告诉你忽略其中一个。 - Cody Gray&
和&&
对于布尔输入的输出不一定相同:https://dev59.com/MWAf5IYBdhLWcg3wZSFI - mallardz