“?=”操作符有哪些优缺点?

3
我考虑的是,而不是
result = result ?? defaultValue;

您可以编写

result ?= defaultValue;

我不是在说这是个好主意。
这个操作符有哪些优势?
这个操作符有哪些缺点?


4
它将解决哪些问题? - Pieter Geerkens
2
只有在您想混淆您的代码时才需要这样做。 - Tim Schmelter
1
@TimSchmelter: 这不是一个没有人听说过的模式。+=, -=, *= - Robert Harvey
2
一个有趣的问题...但是在错误的位置。 - hatchet - done with SOverflow
1
询问此功能的潜在优势更符合stackoverflow的期望。如果您编辑问题以反映这种立场(完全编辑,而不仅仅是添加by line),那么它更有可能被重新打开。 - JaredPar
显示剩余6条评论
4个回答

7

我认为最大的潜在优势是它能够提供其他复合运算符(如+=)相同的优点。请考虑以下内容:

Method().Field = Method().Field ?? someValue;

如果Method()很昂贵或者有副作用,这个语句会导致它发生两次。为了防止这种情况发生,你需要将其分成两行。

var temp = Method();
temp.Field = temp.Field ?? someValue;

如果你陷入这种困境,这可能会有点繁琐。 如果?=具有与+=相同的保证,即左侧的副作用仅发生一次,则不需要额外的一行。

Method().Field += someValue; // Method() happens once
Method().Field ?= someValue; // Method() happens once 

在我看来,相对于简单的??操作符,使用?=操作符提供了关键的优势。虽然它很有价值,但我认为这并不值得将其添加到语言中。


4

这个想法之前就有人提出过,而我在2011年愚人节博客文章中将这个想法推向了极致:

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

与上述文章中提到的所有其他运算符不同,??= 运算符实际上会稍微有点用处。但它的“直接”成本(设计、实现、文档编写等需要时间、精力和资金)肯定不能证明其价值。而且,它绝对不能证明其“机会”成本——将时间、精力和资金花费在一个相当愚蠢且不特别有用的操作符上,可以用来直接解决开发人员实际面对的问题。


0

可能不会。我只在C#中使用过null合并运算符几次,而且从未像这样使用过。C#的做法是编写显式的空检查,而不是随意赋值。(无意冒犯)

我相信很多人都想要这个运算符,但我认为它对语言没有任何好处。

这只是我的观点。


当从某些源(如Web服务)读取值并且您想将缺失的值强制为零或类似值时,空合并运算符非常有用。 - Robert Harvey
我同意。为什么要把 ?= 加入到混乱的 ???: 中,这让很多人都不理解。 - Yuck

0

我认为这不值得。通常情况下,你几乎总是会做类似以下的事情:

result = someSourceValue ?? defaultValue;

你的第二个表单是一个特殊情况,很少会被使用。

当从某些源(如 Web 服务)读取值并希望将缺失值强制为零或其他默认值时,空合并运算符最有用。数据几乎总是来自某个地方,并且要去往其他地方。


1
作为一名版主,我真的很震惊你居然还回答了这个问题。这显然只是一个调查问题,没有建设性;这个问题根本就没有“答案”。它应该立即被关闭。 - Yuck
6
恐怖... - Robert Harvey

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