&&= 在 C# 中? (布尔表达式)[重复]
Posted
技术标签:
【中文标题】&&= 在 C# 中? (布尔表达式)[重复]【英文标题】:&&= in C#? (boolean expression) [duplicate] 【发布时间】:2012-05-17 19:18:04 【问题描述】:可能重复:Why are there no ||= or &&= operators?
今天偶然发现
a &= GetBool();
不一样
a = a && GetBool();
我一定误解了很多年。在第一个示例中,即使“a”为假,也会执行“GetBool()
”。在第二个中,它不是。
有什么可以在 C# 中实现类似“&&=”的东西吗?
【问题讨论】:
@Soohjun:应该是false
而不是true
。
我相信 Eric 在博客上写过为什么 &&=
不可用.....啊,这里是 blogs.msdn.com/b/ericlippert/archive/2012/04/19/…
见this answer by Eric Lippert。
@HenkHolterman:当类型为位/布尔时,位和布尔完全相同。
@HenkHolterman:我想我对自己的 cmets 感到困惑。删除:)
【参考方案1】:
有什么可以在 C# 中实现类似“&&=”的东西吗?
嗯,你可以写
a = a && getBool();
相反...老实说,我想不出很多我真的想要做任何不同的事情。即使是上面的也很少见,IME。
没有为&&
、||
或??
定义复合赋值运算符(它们是明显的“短路”运算符)。有关复合赋值运算符的完整列表,请参阅 C# 4 规范的第 7.17 节,有关确切复合赋值作用的更多详细信息,请参阅第 7.17.2 节。
【讨论】:
【参考方案2】:来自documentation:
使用 &= 赋值运算符的表达式,例如
x &= y
等价于
x = x & y
除了 x 只计算一次。 & 运算符执行 整数操作数的按位逻辑与运算和逻辑与运算 布尔操作数。
我想说,为了避免在不必要时评估 y,请使用
x = x && y
为了避免对 x 进行两次评估(无论这意味着什么),请使用
x &= y
你不能将两者结合起来。
微优化(至少对于理论上的情况),它将是:
if (x) x = y;
如果 x 已经是 false
,则无需执行任何操作。
【讨论】:
“评估一次”用于更复杂的情况,例如如果您有x[i+3] = x[i+3] & y;
那么i+3
显然会计算两次!
@Mr Lister:这是有道理的,我没有考虑到这一点。还有一些属性,您可以在其中使用 &= 运算符,它可能具有任意复杂的实现(如果这是一个好的设计除外)。以上是关于&&= 在 C# 中? (布尔表达式)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
C# LINQ to Entities 无法识别方法“布尔”
ValueError 1:无法将列转换为布尔值:请使用 '&' 表示 'and'、'|' for 'or', '~' for 'not' 在构建 DataFrame 布尔表达式时