C# 使用'&';与'&&';

C# 使用'&';与'&&';,c#,C#,我遇到了这样一个问题: bool Isvalid = isValid & CheckSomething() bool Isvalid = isValid && CheckSomething() 第二种情况可能是短路情况 因此,我们不能总是使用&而不是&&?在&&中,第二个表达式仅在第一个表达式为真时才计算 And&只是连接两个表达式的一种方法,如true&true=true、true&false=false等。&是按位And,这意味着它在位级别工作&&是逻辑AND,这

我遇到了这样一个问题:

bool Isvalid = isValid & CheckSomething()

bool Isvalid = isValid && CheckSomething()
第二种情况可能是短路情况


因此,我们不能总是使用
&
而不是
&&

在&&中,第二个表达式仅在第一个表达式为真时才计算

And&只是连接两个表达式的一种方法,如true&true=true、true&false=false等。

&
是按位And,这意味着它在位级别工作
&&
是逻辑AND,这意味着它在布尔(真/假)级别工作。逻辑AND使用短路(如果第一部分为false,则检查第二部分没有用)来防止运行多余的代码,而按位AND需要对每一位进行操作以确定结果

您应该使用逻辑AND(
&&
),因为这是您想要的,而
&
可能会做错误的事情。但是,如果要评估其副作用,则需要单独运行第二种方法:

var check = CheckSomething();
bool IsValid = isValid && check;

我相信你错过了什么。在第二个场景中,如果isValid为false,则不计算某些内容

条件AND运算符(&&)对其布尔操作数执行逻辑AND运算,但仅在必要时计算其第二个操作数

C#有两种类型的逻辑连接(AND)运算符用于
bool

  • x&y

    • 只有当
      x
      y
      评估为
      true
    • 计算x和
      y
  • x&y

    • 只有当
      x
      y
      评估为
      true
    • 首先计算
      x
      ,如果
      x
      计算结果为
      false
      ,则立即返回
      false
      ,而不计算
      y
      (短路)
  • 因此,如果您同时依赖于被评估的
    x
    y
    ,您可以使用
    &
    操作符,尽管它很少使用,而且更难阅读,因为读者并不总是清楚它的副作用


    注:二进制
    &
    运算符也存在于(
    int
    long
    等)中,它执行按位逻辑AND。

    当应用于布尔值时,这两种形式都是逻辑AND;只是
    &
    版本存在短路。@V4Vendetta:如果使用
    &
    ,则无论
    的值是否有效,都将始终调用
    check something
    。如果使用
    &&
    ,则只有当
    有效时才会调用
    检查某些内容。无论是使用
    &
    还是
    &
    ,表达式本身的结果都应该相同。(由你决定在什么情况下需要调用
    CheckSomething
    。@LukeH,对布尔表达式使用
    &
    的人是那些喜欢玩弄语言功能而不去考虑代码的可读性的程序员。@LukeH显然
    &
    &
    与布尔值一起使用时,由于C#和CLI之间的差异,输出并不总是相同的规格。请看我的问题:不要使用&除非你正在处理比特。如果您不确定,请始终使用&。@Ilya:如果您不处理位,但由于某种原因必须对第二个操作数求值,该怎么办?@LukeH,那么您的代码是不可读的。最好显式调用需要调用的内容,而不是在布尔逻辑表达式中调用。有多少将要维护您的系统的程序员知道C#的这个隐藏特性?@Ilya:我当然不会提倡使用
    &
    (或一般的副作用表达式);我只是在展示这两个操作符之间的差异!(顺便说一句,
    &
    &
    之间的区别其实并不是C#的一个隐藏特性,我所知道的所有类似C的语言都有这个区别。如果维护系统的人不知道这一区别,那么他们需要尽快接受一些培训。)是的,区别在于短路评估。但是你有相反的想法:你几乎应该总是使用
    &&
    。很难给出比这更好的答案。这两个运算符是该语言的特征,这是有原因的。没有人可以直接告诉您忽略其中一个。好的,那么当使用枚举值时将使用哪一个?当使用枚举上的
    Flags
    属性时,&可以与枚举值一起使用。有关更多信息,请在Google上搜索“枚举位和运算符”,我想通常只需使用&&即可,除非您总是希望检查要计算的内容。在这种情况下,你应该像Talljoe一样回答。链接(实际上)断开了。它重定向到某个通用页面。你能举一个例子说明什么时候和什么时候会在C#中有实际用途吗?@eaglei22
    var bob=true;var bob2=真;var bob3=bob和bob2
    在许多CPU上,在该示例中,
    &
    &
    快。感谢您的“逻辑”解释。这不是“串联”的意思。你的第二句话是有害的。