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

77
我们为所有逻辑运算符,移位运算符,加法运算符和所有乘法运算符提供等效的赋值运算符。
为什么逻辑运算符被忽略了呢? 这是否有一个好的技术原因,是很难实现呢?

1
你使用它们的原因是什么? - Matt Ellen
你能提供一个它们有用的例子吗? - Fosco
已开启的提案 https://github.com/dotnet/csharplang/issues/1718 - Orace
1
@aMattEllen: a ||= b; 意味着如果a已定义(不为null),则a仍为a,否则a=b。 这是像Perl这样的语言中的一个古老的东西,非常酷且有用。 - Arsenii
@Fosco,请阅读我上面的评论。 - Arsenii
尝试使用双问号运算符。 例如:a = a ?? b。这是三元运算符和||=之间的一种折中方案。 - Arsenii
3个回答

53

逻辑运算符为什么被省略了?这是由于技术上的难度吗?

它们没有被省略。如果你想要的话,你可以使用&=|=^=

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

46
我以前想过使用短路复合赋值运算符,但由于它们不存在,所以没有人使用它们。请参见https://dev59.com/H3E95IYBdhLWcg3wadKq,其中给出了许多示例用例。 - Ben Voigt
4
你能否将“只有少数人会使用它,它增加了复杂性,并且已经有一种现有的方法可以实现所述目标”的论点解释给我公司中的一些(不想透露姓名的)成员?我已经尝试过了,但显然失败了。 :) - Ed S.
14
什么情况下您想要说“b1 ||= b2; …”?以下是这种情况:我有一个元素的数组,需要为每个元素测试某些条件,因此我循环遍历数组并创建一种“运行总计”:“result = TRUE; for(i...) {result &&= a[i];}” 或者我可能想要做一个“OR”的累加。事实上,我现在正在进行的项目中正是这种情况。这样很傻吗? - daver
30
我强烈反对这个想法是愚蠢的 :) 我只是有以下需求:isAdmin |= IsGroupAdmin(); isAdmin |= IsCompanyAdmin(),其中IsGroupAdmin()IsCompanyAdmin()是需要进行数据库查询的耗时方法。在这种情况下,由于性能原因,我不能使用|=,而必须使用isAdmin=isAdmin ||...,此时使用||=将非常有帮助。 - Ole Albers
21
&&=||= 并不是荒谬的运算符。当 RHS(右手边的值)很昂贵时,它们非常有用。无论是数据库查找、URL 获取还是正则匹配等等,都有大量严肃的用例可以使用这样的运算符。(??= 也属于同一类别,如果为 null,则执行这个昂贵的操作来确定一个值)。我很难认真对待那些认为这是愚蠢的人。 - Tanktalus
显示剩余6条评论

2
最初的回答可能只需使用<p>标签。
isAdmin = isAdmin || IsGroupAdmin()

我猜部分原因是因为 a ||= b 有点令人困惑,因为可能会有两个实现版本:a = a || b 或者 a = b || a。它们的行为不同,因为表达式的右侧有时不会被评估。"最初的回答"

12
非正常顺序。有一个 a -= b,没有人会困惑可能会有一个实现 a = b - a 而不是 a = a - b - Hagen von Eitzen

0
在C#中有两种形式的双问号运算符(null合并运算符)。
a = b ?? c;

并且

a ??= b;

第一个评估的是:a = b != null ? b : c; 第二个 - 就是你所问的:a = a != null ? a : b;
当然,这些变量的位置可能是复杂表达式。
这里有一个参考链接:null-coalescing operators

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接