TN.*_*TN. 10 c# operators null-coalescing-operator null-coalescing
你认为C#会支持像?? = operator这样的东西吗?
而不是这个:
if (list == null)
list = new List<int>();
Run Code Online (Sandbox Code Playgroud)
有可能写:
list ??= new List<int>();
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用(但在我看来,它不太可读):
list = list ?? new List<int>();
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 16
就个人而言,我认为只有第二次扩展才有意义(就保持同一条线而言+=):
list = list ?? new List<int>();
Run Code Online (Sandbox Code Playgroud)
但说实话,我发现它有点不必要.人们通常"得到" i += 5;,但往往会出现null-coalescing(??)的问题.添加一个null-coalescing-assignment操作符......好吧,我看不到它的结局很好.
我个人赞成原始代码:
if(list == null) { list = new List<int>(); }
....
Run Code Online (Sandbox Code Playgroud)
另外 - 考虑:在所有其他方面+=,-=等等 - 总是评估右侧.在这种情况下,它不会(在某些情况下).这增加了更多的困惑.我的意思是:
i += SomethingCriticalThatMustBeCalled(); // fine - always runs
j ??= SomethingElseCriticalThatMustBeCalled(); // is this run? if j != null?
Run Code Online (Sandbox Code Playgroud)
我一直想要这样的东西。我会比单独使用它更频繁地使用它??。
不过,我真正想要的是一种运算符形式,它允许您仅在非空时取消引用该对象。要替换它:
int count = (list != null)? list.Count : 0
Run Code Online (Sandbox Code Playgroud)
像这样的东西:
int count = list??.Count : 0
Run Code Online (Sandbox Code Playgroud)
这对我来说特别有用,因为有很长的参考链(我知道设计很糟糕),但是例如
int count = foo??.bar??.baz??.list??.Count : 0
Run Code Online (Sandbox Code Playgroud)
目前这是不可能的,??因为您只能说“分配给 foo,或者如果为 null 则为替代项”,而不能说“分配给foo 的属性,或者如果为 null 则为替代项”。
| 归档时间: |
|
| 查看次数: |
463 次 |
| 最近记录: |