在C#中表达AND NOT运算符的正确方法是什么?

What is the proper way to express the AND NOT operator in C#?

本问题已经有最佳答案,请猛点这里访问。

我和一个同事讨论了用什么风格来表达C中的非条件。虽然这两种方法都有效,但我们对运算符的样式不一致。

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

1
db.Widget.Where(w => w.Name =="Foo" && !w.IsBlue);

我认为这是可行的,但是&;!会工作。例如:

1
db.Widget.Where(w => w.Name =="Foo" &! w.IsBlue);

我以前有一本关于C风格的书,但不记得看到这本书了。这有什么用?


它们都是differentlogical and operators。&;&;是逻辑与运算符,而对于整型,则计算其操作数的逻辑位与。对于布尔操作数,&;计算其操作数的逻辑和,请参阅。一个区别是,&&会短路,而&不会短路。

在这种特殊情况下,逻辑和更容易理解,因为它最常用于逻辑和。如前所述,&;将短路条件,例如,如果&&在条件声明中出现错误,则不会对右侧的进一步条件进行评估,但不会短路。请参阅下面给出的示例。

1
2
3
4
5
6
7
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);

产量

1
2
2
3

在上面的例子中,使用&&,如果a不是1,那么剩余条件将不会被评估,这与按位&不一样。由于短路,B不递增,但随着短路,B值递增,因为未应用短路。

在我看来,在这里使用&;&;更合适,因为它可以使代码更容易理解以及短路。