C# 为什么要按位和?

C# 为什么要按位和?,c#,bitwise-and,C#,Bitwise And,我只是好奇的代码没有问题。我正在查看这段代码,我试图弄清楚它们为什么按位而不仅仅是普通代码&& bool bValid = true; .... // some code here bValid &= IsASMConfigurationValid(this.m_ThisDevices[BDCASM], ref el); .... // more code here bValid &= IsSPEConfigurationValid(this.m_ThisDevices[BDCS

我只是好奇的代码没有问题。我正在查看这段代码,我试图弄清楚它们为什么按位而不仅仅是普通代码&&

bool bValid = true;
.... // some code here
bValid &= IsASMConfigurationValid(this.m_ThisDevices[BDCASM], ref el);
.... // more code here
bValid &= IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE], ref el);

我只是想知道为什么这样做,而不是将bValid=设置为IsConfigValid。这很可能就是他的编码风格。

我可以看到一些选项:

  • 懒散-为什么再次输入bValid?让我们只使用
    &=
    来避免再次写入它
  • 优化-bValid只评估一次()
  • 随机性
请记住,
bool
操作数没有按位运算,因此它只是一个逻辑AND


所有这些都是非常个人化的,最好的答案将来自房地产开发商。

我可以看到一些选项:

  • 懒散-为什么再次输入bValid?让我们只使用
    &=
    来避免再次写入它
  • 优化-bValid只评估一次()
  • 随机性
请记住,
bool
操作数没有按位运算,因此它只是一个逻辑AND


所有这些都是非常个人化的,最好的答案将来自真正的开发者。

让我们看看这句话:

bValid&=isSpecConfiguration有效(this.m_ThisDevices[BDCSPE],ref el)

这可以改写为:

bValid=bValid&&IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE],ref el)

if(bValid){
bValid=IsSpecConfiguration有效(this.m_ThisDevices[BDCSPE],参考el);
}

…或其他类似形式。
&=
使代码缩短了几个字符,但正如您所发现的,主要是使代码更难阅读

更新:正如评论员指出的,&=不会像&&那样对bool短路,因此仍然调用右侧函数的真正替代方法是:

var temp=ISSpecConfiguration有效(this.m_ThisDevices[BDCSPE],参考el);

bValid=bValid&temp

让我们看看这一行:

bValid&=isSpecConfiguration有效(this.m_ThisDevices[BDCSPE],ref el)

这可以改写为:

bValid=bValid&&IsSPEConfigurationValid(this.m_ThisDevices[BDCSPE],ref el)

if(bValid){
bValid=IsSpecConfiguration有效(this.m_ThisDevices[BDCSPE],参考el);
}

…或其他类似形式。
&=
使代码缩短了几个字符,但正如您所发现的,主要是使代码更难阅读

更新:正如评论员指出的,&=不会像&&那样对bool短路,因此仍然调用右侧函数的真正替代方法是:

var temp=ISSpecConfiguration有效(this.m_ThisDevices[BDCSPE],参考el);

bValid=bValid&&temp

因此,首先,这里没有使用按位运算符。
&
运算符有几个重载;它既有许多用于数字类型的位重载,也有用于布尔值的重载,这些布尔值执行逻辑运算,并且不会短路


至于为什么代码作者没有使用
&&=
操作符而不是
&=
操作符,那是因为没有
&&=
操作符,只有
&=
操作符。

因此,首先,这里没有使用位操作符。
&
运算符有几个重载;它既有许多用于数字类型的位重载,也有用于布尔值的重载,这些布尔值执行逻辑运算,并且不会短路


至于为什么代码作者没有使用
&&=
操作符而不是
&=
操作符,那是因为没有
&&&=
操作符,只有
&=
操作符。

如果这是您在这段代码中唯一的问题……布尔值没有“按位AND”操作符,只有“非短路”操作符。。。所以不清楚你有什么问题。。。当涉及布尔值时,
&
&
之间的区别。标志的顺序更新?如果这些IsASM调用中的任何一个返回false,那么bValid将变为false并保持false,OP提到这不是他的代码。我们不要假设他是一个爱变态的人。如果这是你唯一的问题…布尔值没有“按位AND”,有“非短路”一个。。。所以不清楚你有什么问题。。。当涉及布尔值时,
&
&
之间的区别。标志的顺序更新?如果这些IsASM调用中的任何一个返回false,那么bValid将变为false并保持false,OP提到这不是他的代码。我们不要假设他是一个爱
的变态。我想说使用
&=
的唯一原因会有所不同,就是
IsSpecConfiguration Valid
有一些副作用,开发人员需要运行它,即使
bValid
在这一点上是错误的。这本身就是一种代码气味。“这可以重写为…&&&”-两行之间存在巨大差异-您的代码将不会运行
bValid==false
情况下的函数。@AlexeiLevenkov使用
&
her还意味着无论发生什么情况,
bValid
都将被计算两次,除了第二个操作数可能短路之外。@RobertLevy您试图短路第二个操作数导致您编写了强制对该表达式求值的代码,因为您将其重构为一个变量。@Servy说得很好,但如果“求值两次”,我会非常担心对于非易失性布尔变量(如OP示例中的布尔变量),确实会导致任何更改…我想说使用
&=
的唯一原因是
IsSPEConfigurationValid
有一些副作用,并且开发人员需要运行它,即使此时
bValid
为false。这本身就是一个密码