你认为C#将支持类似?? =操作?

代替此的:

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

这可能是可以写:

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

现在,我可以使用(但在我看来没有得到很好的可读性):

list = list ?? new List<int>();
有帮助吗?

解决方案

我一直想这样的事情。我将其本身更经常用它比??

我真正想要的,虽然是运营商的一种形式,可以让你只有非空取消引用的对象。要更换这样:

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

使用是这样的:

    int count = list??.Count : 0

这将是非常有用的我引用的长链(糟糕的设计,我知道),但例如:

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

这是目前不可能与??,因为你只能说“指定为foo,或者空的替代”,而不是“分配到的属性的FOO的,或者如果空替代。 “

其他提示

我个人认为只有第二膨胀有意义(沿同一行+=等保持计):

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

但说实话我觉得有点不必要。人们通常“搞定” i += 5;,但往往有空凝聚(??)的问题。添加一个空凝聚赋值操作符和......嗯,我看不出它在结束很好。

我个人偏爱的原代码:

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

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

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

我发现这里的某个地方开个玩笑计算器是做这样的事情...

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

...你也许能够在代码中使用类似的懒惰EVAL。

我喜欢它 - 它是一个不错的,以表达延迟加载表达简洁的方式。无论它是否被添加到语言又是另一回事完全 - 为的埃里克利珀爱指出,新功能需要显著大量的工作来实现,因此他们必须贡献显著净正的语言才能被列入

除非我看了你的问题错了,运营商确实存在在C#的 http://msdn.microsoft.com/en-us/library/ms173224(VS.80)的.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top