用C#表示AND NOT运算符的正确方法是什么?

用C#表示AND NOT运算符的正确方法是什么?,c#,operators,C#,Operators,我和一位同事讨论了用什么风格来表达C#中的and NOT条件。虽然这两种方法都有效,但我们对运算符的样式存在分歧 他说&!是首选的方式。例如: db.Widget.Where(w => w.Name == "Foo" && !w.IsBlue); db.Widget.Where(w => w.Name == "Foo" &! w.IsBlue); 我说那会有用的,但是&!会有用的。例如: db.Widget.Where(w => w.Name ==

我和一位同事讨论了用什么风格来表达C#中的and NOT条件。虽然这两种方法都有效,但我们对运算符的样式存在分歧

他说&!是首选的方式。例如:

db.Widget.Where(w => w.Name == "Foo" && !w.IsBlue);
db.Widget.Where(w => w.Name == "Foo" &! w.IsBlue);
我说那会有用的,但是&!会有用的。例如:

db.Widget.Where(w => w.Name == "Foo" && !w.IsBlue);
db.Widget.Where(w => w.Name == "Foo" &! w.IsBlue);
我以前有一本关于C#风格的书,但不记得看过这本书。这样做有什么用?

它们都是不同的逻辑and运算符。是逻辑and运算符,而对于整数类型,则计算其操作数的逻辑位and。对于布尔操作数,&计算其操作数的逻辑AND。一个区别是
&
将短路,而
&
不会短路

在这种特殊情况下,逻辑and更容易理解,因为它最常用于逻辑and。如前所述,&&will短路该条件,例如,如果
&
在条件语句中变为false,则不会评估右侧的其他条件,但&不会短路。请参见下面给出的示例

int a = 1;
int b = 2;
int c = 3;
bool r = a == 2 && ++b == 2;
Console.WriteLine(b);
r = a == 2 & ++b == 2;
Console.WriteLine(b);
输出

2
3
在上面的示例中,使用
&
如果
a
不是1,则不会计算剩余条件,这与按位
&
的情况不同。由于&&的短路,b不会增加,但随着&,b的值会增加,因为未应用短路


在我看来,在这里使用&&更合适,因为它使代码更容易理解,同时也会短路

如果第一个操作数为
false
,则
&&
将短路,而
&
则不会短路。强烈建议不要为此使用按位
&
。。。虽然它可能会起作用,但它不是自然的,会让一些编码人员挠头去弄清楚它的意图。如果需要拼写的话,这里没有“And not”运算符,只有三个按位And、boolean And和boolean not运算符。这里没有“the
&&!
运算符”或“the
&!
运算符”。只有
&
&
操作符,还有
运算符,可应用于
&&
&
运算符的任一操作数。有关
&
&
@CoryNelson之间的区别,请参见标记的重复项:尽量不要将
&
视为“按位”,因为它在
bool
上完全合法。在C#中,bool上的
&
不是位and运算符,而是没有短路的逻辑and运算符:谢谢@king_nak让我纠正了这个错误。