您怎么看?= C#中的运算符?

TN.*_*TN. 10 c# operators null-coalescing-operator null-coalescing

你认为C#会支持像?? = operator这样的东西吗?

而不是这个:

if (list == null)
  list = new List<int>();
Run Code Online (Sandbox Code Playgroud)

有可能写:

list ??= new List<int>();
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用(但在我看来,它不太可读):

list = list ?? new List<int>();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 16

就个人而言,我认为只有第二次扩展才有意义(就保持同一条线而言+=):

list = list ?? new List<int>();
Run Code Online (Sandbox Code Playgroud)

但说实话,我发现它有点不必要.人们通常"得到" i += 5;,但往往会出现null-coalescing(??)的问题.添加一个null-coalescing-assignment操作符......好吧,我看不到它的结局很好.

我个人赞成原始代码:

if(list == null) { list = new List<int>(); }
....
Run Code Online (Sandbox Code Playgroud)

另外 - 考虑:在所有其他方面+=,-=等等 - 总是评估右侧.在这种情况下,它不会(在某些情况下).这增加了更多的困惑.我的意思是:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
Run Code Online (Sandbox Code Playgroud)

  • 我同意可读性非常有价值,但我发现?? =运算符相当容易掌握(然后我再次喜欢haskell,所以也许我习惯于任意运算符).但我不认为马克的第二个例子是非常好的.你不应该将关键代码作为+ =的副作用运行,所以它非常人为. (3认同)

Tes*_*rex 4

我一直想要这样的东西。我会比单独使用它更频繁地使用它??

不过,我真正想要的是一种运算符形式,它允许您仅在非空时取消引用该对象。要替换它:

    int count = (list != null)? list.Count : 0
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

    int count = list??.Count : 0
Run Code Online (Sandbox Code Playgroud)

这对我来说特别有用,因为有很长的参考链(我知道设计很糟糕),但是例如

    int count = foo??.bar??.baz??.list??.Count : 0
Run Code Online (Sandbox Code Playgroud)

目前这是不可能的,??因为您只能说“分配给 foo,或者如果为 null 则为替代项”,而不能说“分配给foo 的属性,或者如果为 null 则为替代项”。

  • 这是一个经常要求的功能。我们正在考虑。 (5认同)