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

Why are there no ||= or &&= operators in C#?

提问人:George Duckett 提问时间:6/14/2011 最后编辑:AntonioGeorge Duckett 更新时间:8/18/2023 访问量:17387

问:

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

为什么逻辑运算符被排除在外? 有没有很好的技术理由来解释为什么它很难?

C# 语言设计 运算 赋值

评论

1赞 Matt Ellen 6/14/2011
你使用它们有什么原因吗?
0赞 Fosco 6/14/2011
您能举例说明它们有什么用吗?
0赞 Orace 11/4/2021
开放提案 github.com/dotnet/csharplang/issues/1718
1赞 Arsenii 7/25/2023
@MattEllen: a ||= 乙;表示 a 静止 a(如果已定义)(非 null)或否则 a = b。这在像Perl这样的语言中是一个老东西,真的很酷,很有用。
0赞 Arsenii 7/25/2023
@Fosco,请阅读我上面的评论

答:

53赞 Eric Lippert 6/14/2011 #1

为什么逻辑运算符被排除在外?有没有很好的技术理由来解释为什么它很难?

他们没有。你可以做,或者,如果你愿意。&=|=^=

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

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

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

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

有关复合运算符的更多信息,请参阅我的严肃文章:
https://learn.microsoft.com/en-us/archive/blogs/ericlippert/compound-assignment-part-one

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

评论

45赞 Ben Voigt 6/14/2011
我以前想要短路化合物分配。没有人使用它们,因为它们不存在。另请参阅 stackoverflow.com/questions/2324549,其中提供了许多示例用例。
4赞 Ed S. 6/15/2011
您能否向我公司的一些(不愿透露姓名)成员解释“只有少数人会使用它,它增加了复杂性,并且无论如何都有一种现有的方法可以实现既定目标”的论点?我试过了,但显然失败了。:)
14赞 daver 8/10/2013
回复:“在什么情况下你想说”?这些情况: 我有一个元素数组,需要测试每个元素的一些条件,所以我遍历数组并创建一个“运行总计”: 或者我可能想做一个运行总计的“OR”。事实上,在我现在正在做的一个项目中,我就遇到了这样的情况。有那么傻吗?b1 ||= b2; ...result=TRUE; for (i...) {result &&= a[i];}
29赞 Ole Albers 10/6/2017
我强烈不同意这种愚蠢的:)我只是有以下要求:,其中和是需要数据库选择的昂贵方法。在这些情况下,出于性能原因,我显然不能使用,必须使用,并且确实会有所帮助。isAdmin |= IsGroupAdmin(); isAdmin |= IsCompanyAdmin()IsGroupAdmin()IsCompanyAdmin()|=isAdmin=isAdmin ||...||=
21赞 Tanktalus 4/5/2018
&&=而且远非傻傻。当 RHS 价格昂贵时,它们非常有用。无论是数据库查找还是 URL 提取或正则表达式匹配或......对于这样的运营商来说,有大量严肃的用例。( 也属于同一类别 - 如果它为 null,则执行这个昂贵的大操作来确定一个值)。我很难认真对待一个认为这很愚蠢的人。||=??=
2赞 Jinghuan Wen 8/9/2019 #2

也许只是使用

isAdmin = isAdmin || IsGroupAdmin()

我想这部分是因为有点令人困惑,因为可能有两个版本的实现:,或。它们的行为不同,因为表达式的右侧有时没有被评估。a ||= ba = a || ba = b || a

评论

12赞 Hagen von Eitzen 3/14/2021
Non sequitur.有,没有人对可能有一个实现而不是a -= ba = b - aa = a - b
0赞 Arsenii 8/18/2023 #3

在 C# 中,有一个双问号运算符(空合并运算符)。

它有两种形式:

a = b ?? c;

a ??= b;

第一个计算结果为:a = b != null ?乙:丙; 第二个 - 是你要问的:a = a != null ?答:乙;

当然,在这些变量中的任何一个位置上都可能是复杂的表达式。

下面是一个参考:空合并运算符