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

时间:2010-03-30 15:18:02

标签: c# operators null-coalescing-operator null-coalescing

你认为C#会支持像?? = operator吗?

而不是:

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

可能会写:

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

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

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

5 个答案:

答案 0 :(得分:16)

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

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

但老实说我发现它有点不必要了。人们通常“得到”i += 5;,但往往会遇到空合并问题(??)。添加一个null-coalescing-assignment操作符......好吧,我认为它没有很好地结束。

我个人赞成原始代码:

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

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

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

答案 1 :(得分:4)

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

我真正想要的是一种运算符形式,只有非null时才允许您取消引用该对象。要替换它:

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

有这样的事情:

    int count = list??.Count : 0

对于我来说,使用长引用链(我知道设计不好)对我来说特别有用,但是例如

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

??目前无法实现这一点,因为您只能说“分配给foo,或者替换为空”但不能“分配给foo的属性,或者替代如果为null。“

答案 2 :(得分:4)

我在stackoverflow上找到的一个技巧就是做这样的事情......

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

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

答案 3 :(得分:3)

我喜欢它 - 它是表达延迟加载表达式的一种很好的,简洁的方式。是否将其添加到语言中是另一回事 - 正如Eric Lippert loves to point out所述,新功能需要大量工作才能实现,因此它们必须为语言贡献显着的净积极才能被包含在内。

答案 4 :(得分:1)

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