为什么C#中没有|| =或&& =运算符?

Geo*_*ett 56 c# language-design operators assignment-operator compound-assignment

我们为所有逻辑运算符,Shift运算符,Additive运算符和所有Multiplicative运算符都有等效的赋值运算符.

为什么逻辑运算符被遗漏了?难道有一个很好的技术理由吗?

Eri*_*ert 47

为什么逻辑运算符被遗漏了?难道有一个很好的技术理由吗?

他们没有.你可以做&=或者|=或者^=如果你想.

bool b1 = false;
bool b2 = true;
b1 |= b2; // means b1 = b1 | b2
Run Code Online (Sandbox Code Playgroud)

||&&运营商没有以化合物的形式,因为坦率地说,他们是一个有点傻.在什么情况下你想说

b1 ||= b2;
b1 &&= b2;
Run Code Online (Sandbox Code Playgroud)

如果左侧不改变,则不评估右侧?似乎只有少数人会真正使用这个功能,为什么要把它放进去?

有关复合运算符的更多信息,请参阅我的严肃文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/03/29/compound-assignment-part-one.aspx

和后续的愚人节文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/04/01/compound-assignment-part-two.aspx

  • 我之前想要短路复合分配.没有人使用它们因为它们不存在.另请参见http://stackoverflow.com/questions/2324549,其中提供了许多示例用例. (19认同)
  • `&&=` 和 `||=` 绝非愚蠢。当 RHS 价格昂贵时,它们非常有用。无论是 db 查找还是 URL 获取或正则表达式匹配,或者……对于这样的运算符,都有大量严重的用例。(`??=` 也属于同一类别 - 如果它为空,则执行这个大而昂贵的操作来确定一个值)。我很难认真对待一个认为这很愚蠢的人。 (10认同)
  • 我强烈反对愚蠢:)我只是有以下要求:`isAdmin | = IsGroupAdmin(); isAdmin | = IsCompanyAdmin()`,其中`IsGroupAdmin()`和`IsCompanyAdmin()`是需要数据库选择的昂贵方法.在这些情况下,出于性能原因我不能使用`| =`并且必须使用`isAdmin = isAdmin || ...`并且`|| =`会真的有用. (9认同)
  • re:"在什么情况下你想说'b1 || = b2; ......`"?这些情况:我有一个元素数组,需要为每个元素测试一些条件,所以我遍历数组并创建一个'运行总计'的排序:`result = TRUE; for(i ...){result && = a [i];}`或者我可能想要总计'OR'.事实上,我现在正在进行的项目中遇到这种情况.这太傻了吗? (8认同)
  • 你能否解释一下"只有少数人会使用它,它增加了复杂性,并且有一种现有的方法来实现既定的目标"我的公司的一些(不是名字)成员的论点?我试过并且显然失败了.:) (3认同)
  • @daver:抱歉,我在发布时错过了您的评论。尽管这似乎有道理,但您可以将更有效的习语用于这些场景。`array.All(x=>x)` 可能有点难以阅读,但它与您建议的迭代 `&&` 操作具有相同的语义**并且**当检测到第一个 false 时它会退出,而不是继续迭代数组,试图使表达式为真。类似的对于迭代的 `||` 的 `array.Any(x=>x)`。 (2认同)