你认为C#会支持像?? = operator吗?
而不是:
if (list == null)
list = new List<int>();
可能会写:
list ??= new List<int>();
现在,我可以使用(但在我看来它不太可读):
list = list ?? new List<int>();
答案 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