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

你认为C#会支持像?? = operator这样的东西吗? 而不是这个:
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,或者替换为null”但不是“分配给foo的属性,或者替换为null”。     
就个人而言,我认为只有第二次扩张才有意义(就保持与
+=
相同的方式而言):
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?
    
我在stackoverflow上找到的一个技巧是做这样的事情......
private List<string> myList;
public List<string> MyProp 
{
    get { return myList ?? (myList= new List<string>()); }
}
...你可以在你的代码中使用类似的懒惰eval。     
我喜欢它 - 它是表达延迟加载表达式的一种很好的,简洁的方式。无论它是否被添加到语言中都是另一回事 - 正如Eric Lippert所指出的那样,新功能需要大量的工作才能实现,因此它们必须为语言贡献一个重要的净积极因素才能被包含在内。     
除非我读错了你的问题,否则该操作符确实存在于C#中:http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx     

要回复问题请先登录注册