你对C#中的???=运算符有什么看法?

你对C#中的???=运算符有什么看法?,c#,operators,null-coalescing-operator,null-coalescing,C#,Operators,Null Coalescing Operator,Null Coalescing,你认为C#会支持像???=操作符这样的东西吗 与此相反: if (list == null) list = new List<int>(); if(list==null) 列表=新列表(); 也许可以这样写: list ??= new List<int>(); list???=新列表(); 现在,我可以使用(但在我看来,它不太可读): list=list??新列表(); 我喜欢它-这是一种很好的简洁方式来表达惰性加载表达式。无论它是否被添加到语言中都是另一回事

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

与此相反:

if (list == null)
  list = new List<int>();
if(list==null)
列表=新列表();
也许可以这样写:

list ??= new List<int>();
list???=新列表();
现在,我可以使用(但在我看来,它不太可读):

list=list??新列表();

我喜欢它-这是一种很好的简洁方式来表达惰性加载表达式。无论它是否被添加到语言中都是另一回事,因为新功能需要大量的工作来实现,因此它们必须对语言做出显著的积极贡献才能被包括在内。

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

另外,请考虑:在所有其他
+=
-=
等中,始终计算右侧。在这种情况下,它不会(在某些情况下)这样做。这会增加更多的混淆。我的意思是:

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

我一直想要这样的东西。我会经常使用它,而不是
本身

不过,我真正想要的是一种运算符形式,它允许您仅在非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,则说一个替代项”。

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

private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}
私有列表myList;
公共列表MyProp
{
获取{return myList???(myList=new List());}
}

…你也许可以在你的代码中使用类似的lazy eval。

除非我看错了你的问题,否则这个操作符确实存在于C中:

那太酷了!不确定它是否支持它…但是,是的,我喜欢它!这个想法让我的Ruby部分兴奋不已。(请参阅Ruby
|=
操作符。)我同意。这是在书写速度和可读性之间的选择。可读性每次都赢。我同意可读性非常有价值,但我发现???=运算符相当容易掌握(再说一遍,我喜欢haskell,所以可能我习惯了任意运算符).但我不认为Marc的第二个例子是一个很好的例子。无论如何,你不应该把关键代码作为a+=的副作用来运行,所以这是非常做作的。虽然我同意,但我认为这与C#的一般工作方式背道而驰。它让我想起了更多像Obj-C这样的消息传递语言,其中[list count];将返回null而不是触发null异常错误。在C#中,这会使语法更加混乱,特别是在这种情况下,您几乎总是想使用它。当然,我同意,就像任何事情一样,这可能是危险的。我决不建议用忽略所有null引用来代替错误处理但是在某些情况下,null是完全可以接受的,并且在这种情况下您可以使用有效的替代值。这是一个经常请求的功能。我们正在考虑它。我建议您使用foo?.bar?.baz…这样会减少混乱:),并且它将与Groovy中的保存导航兼容:的确,我在这里看不到巨大的好处。我有点惊讶,当??增加了,但它实际上并没有增加很多能量。
    int count = list??.Count : 0
    int count = foo??.bar??.baz??.list??.Count : 0
private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}