你认为 C# 会支持 ??= 运算符吗?
而不是这个:
if (list == null)
list = new List<int>();
或许可以写成:
list ??= new List<int>();
现在,我可以使用(但在我看来不太可读):
list = list ?? new List<int>();
你认为 C# 会支持 ??= 运算符吗?
而不是这个:
if (list == null)
list = new List<int>();
或许可以写成:
list ??= new List<int>();
现在,我可以使用(但在我看来不太可读):
list = list ?? new List<int>();
就我个人而言,我认为只有第二个扩展才有意义(就保持与+=
etc 保持一致而言):
list = list ?? new List<int>();
但老实说,我觉得这有点不必要。人们通常会“get” i += 5;
,但往往会遇到 null-coalescing ( ??
) 的问题。添加一个 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。
我一直想要这样的东西。我会比单独使用它更频繁地使用它??
。
不过,我真正想要的是一种运算符,它允许您仅在非 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 的替代方案”。
我喜欢它——它是表达延迟加载表达式的一种很好、简洁的方式。是否将其添加到语言中完全是另一回事 - 正如Eric Lippert 喜欢指出的那样,新功能需要大量工作才能实现,因此它们必须对语言做出重大的净积极影响才能被包含在内。
除非我读错了你的问题,否则 C# 中确实存在该运算符:http: //msdn.microsoft.com/en-us/library/ms173224 (VS.80).aspx