10

你认为 C# 会支持 ??= 运算符吗?

而不是这个:

if (list == null)
  list = new List<int>();

或许可以写成:

list ??= new List<int>();

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

list = list ?? new List<int>();
4

5 回答 5

16

就我个人而言,我认为只有第二个扩展才有意义(就保持与+=etc 保持一致而言):

list = list ?? new List<int>();

但老实说,我觉得这有点不必要。人们通常会“get” i += 5;,但往往会遇到 null-coalescing ( ??) 的问题。添加一个 null-coalescing-assignment 运算符,然后......好吧,我认为它的结局并不好。

我个人喜欢原始代码:

if(list == null) { list = new List<int>(); }
....

另外 - 考虑:在所有其他+=等等-=- 总是评估右手边。在这种情况下,它不会(在某些情况下)。这增加了更多的混乱。我的意思是:

i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
于 2010-03-30T15:28:14.003 回答
4

我在stackoverflow上发现的一个技巧是做这样的事情......

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}

...您也许可以在代码中使用类似的惰性 eval。

于 2010-03-30T16:35:17.073 回答
4

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

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

    int count = (list != null)? list.Count : 0

像这样:

    int count = list??.Count : 0

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

    int count = foo??.bar??.baz??.list??.Count : 0

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

于 2010-03-30T15:29:40.653 回答
3

我喜欢它——它是表达延迟加载表达式的一种很好、简洁的方式。是否将其添加到语言中完全是另一回事 - 正如Eric Lippert 喜欢指出的那样,新功能需要大量工作才能实现,因此它们必须对语言做出重大的净积极影响才能被包含在内。

于 2010-03-30T15:24:54.300 回答
1

除非我读错了你的问题,否则 C# 中确实存在该运算符:http: //msdn.microsoft.com/en-us/library/ms173224 (VS.80).aspx

于 2010-03-30T16:39:01.033 回答