【问题标题】:Why are there no ||= or &&= operators in C#?为什么 C# 中没有 ||= 或 &&= 运算符?
【发布时间】:2011-09-14 19:36:53
【问题描述】:

我们为所有逻辑运算符、移位运算符、加法运算符和所有乘法运算符提供等效的赋值运算符。

为什么逻辑运算符被遗漏了? 是否有充分的技术原因使其难?

【问题讨论】:

标签: c# operators language-design assignment-operator compound-assignment


【解决方案1】:

为什么逻辑运算符被遗漏了?是否有充分的技术原因使其难?

他们没有。如果您愿意,可以使用&=|=^=

bool b1 = false;
bool b2 = true;
b1 |= b2; // means b1 = b1 | b2

||&& 运算符没有复合形式,因为坦率地说,它们有点傻。在什么情况下你想说

b1 ||= b2;
b1 &&= b2;

如果左侧不变,则不评估右侧?似乎只有少数人会真正使用此功能,那为什么要放呢?

有关复合运算符的更多信息,请在此处查看我的严肃文章:
https://docs.microsoft.com/en-us/archive/blogs/ericlippert/compound-assignment-part-one

以及此处的愚人节后续文章:
https://docs.microsoft.com/en-us/archive/blogs/ericlippert/compound-assignment-part-two

【讨论】:

  • 我以前想要短路复合赋值。没有人使用它们,因为它们不存在。另请参阅stackoverflow.com/questions/2324549,其中提供了一些示例用例。
  • 您能否解释一下“只有少数人会使用它,它增加了复杂性,并且无论如何都有一种实现既定目标的现有方法”的一些(未命名)成员的论点?我的公司?我试过了,显然失败了。 :)
  • 回复:“在什么情况下你想说b1 ||= b2; ...”?这些情况:我有一个元素数组,需要为每个元素测试一些条件,所以我循环遍历数组并创建一个“运行总计”的排序:result=TRUE; for (i...) {result &&= a[i];} 或者我可能想做一个运行总计“或” .事实上,我现在正在做的一个项目中,就遇到过这样的情况。这么傻吗?
  • 我非常不同意这种愚蠢的做法:) 我只有以下要求:isAdmin |= IsGroupAdmin(); isAdmin |= IsCompanyAdmin(),其中IsGroupAdmin()IsCompanyAdmin() 是需要数据库选择的昂贵方法。在这些情况下,出于性能原因,我显然不能使用|=,而必须使用isAdmin=isAdmin ||...,而||= 真的很有帮助。
  • &&=||= 远非愚蠢。当 RHS 价格昂贵时,它们非常有用。无论是数据库查找、URL 获取、正则表达式匹配还是……对于这样的操作符,有大量严重的用例。 (??= 也属于同一类别 - 如果它为空,则执行这个昂贵的大操作来确定一个值)。我很难认真对待认为这很愚蠢的人。
【解决方案2】:

也许只是使用

isAdmin = isAdmin || IsGroupAdmin()

我猜这部分是因为a ||= b 有点令人困惑,因为可能有两个版本的实现:a = a || ba = b || a。而且它们的行为不同,因为有时不计算表达式的右侧。

【讨论】:

  • 不合理。有a -= b,没有人会混淆可能有一个实现a = b - a而不是a = a - b
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 2011-10-04
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2014-05-20
相关资源
最近更新 更多