3

我在想而不是

result = result ?? defaultValue;

你可以写

result ?= defaultValue;

我并不是说这是个好主意。
这个运营商有什么优势?
这个运营商会有什么劣势?

4

4 回答 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 

恕我直言,这是?=通过简单的操作员提供的关键优势??。这将是有价值的,但我认为它不值得添加到语言中

于 2013-03-13T23:15:12.670 回答
4

This has been suggested before, and I based my 2011 April Fool's Day blog post on taking this idea to the extreme:

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

Unlike all the other operators mentioned in that post, ??= would actually be a little bit useful. It would not be useful enough to justify its "direct" costs -- designing and implementing and documenting and all that costs time and effort and money. And it certainly would not justify its "opportunity" costs -- the time, effort and money spent on doing a rather silly and not particularly useful operator could be spent on features that directly address real problems that developers actually have.

于 2013-03-14T06:46:54.420 回答
0

我不认为这是值得的。通常,您几乎总是会执行以下操作:

result = someSourceValue ?? defaultValue;

您的第二种形式是一种特殊情况,很少使用。

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

于 2013-03-13T23:11:57.853 回答
0

可能不是。我在 C# 中只使用过几次空合并运算符,但从来没有这样。C# 做事的方式是编写显式的空检查,而不是随意分配。(没有冒犯的意思)

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

这只是我的意见。

于 2013-03-13T23:12:01.357 回答