Jay*_*Jay 87 c# syntax programming-languages operators null-coalescing-operator
null coalescing大致翻译为 return x, unless it is null, in which case return y
我经常需要 return null if x is null, otherwise return x.y
我可以用 return x == null ? null : x.y;
不错,但null中间总是困扰我 - 这似乎是多余的.我更喜欢这样的东西return x :: x.y;,::只有在它之前的东西不是的时候才会评估null.
我认为这几乎与null合并相反,有点简洁,内联null检查,但我[ 几乎 ]确定在C#中没有这样的运算符.
(我知道我可以用C#编写一个方法;我使用return NullOrValue.of(x, () => x.y);,但如果你有更好的东西,我也希望看到它.)
Jon*_*eet 61
Groovy中有一个null-safe解引用运算符(?.)...我认为这就是你所追求的.
(它也被称为安全导航操作员.)
例如:
homePostcode = person?.homeAddress?.postcode
Run Code Online (Sandbox Code Playgroud)
这将使如果空person,person.homeAddress或person.homeAddress.postcode为空.
(现在可以在C#6.0中使用,但在早期版本中不可用)
Eri*_*ert 35
我们考虑过添加?到C#4.它没有削减; 这是一个"很高兴"的功能,而不是"必备"功能.我们将再次考虑该语言的假设未来版本,但如果我是你,我不会屏住呼吸.随着时间的推移,它不太可能变得更加重要.:-)
Eri*_*ric 16
如果你有一种特殊的短路布尔逻辑,你可以这样做(javascript示例):
return x && x.y;
Run Code Online (Sandbox Code Playgroud)
如果x为null,则不会进行评估x.y.
将此作为答案添加是正确的.
我想在C#中没有这样的东西的原因是因为,与合并运算符(仅对引用类型有效)不同,反向操作可以产生引用或值类型(即class x使用成员int y- 因此不幸的是在许多情况下无法使用
但是,我不是说我不想看到它!
该问题的潜在解决方案是操作员可以自动将右侧的值类型表达式提升为可空.但是你有一个问题,x.y即y是一个int,实际上会返回一个int?很痛苦的问题.
另一个可能更好的解决方案是,如果左侧的表达式为null,则操作符将返回右侧类型的默认值(即null或0).但是,您有一些问题可以区分实际读取零/ null的情况,x.y或者它是否由安全访问运算符提供.
Delphi有:(而不是.)运算符,它是null安全的.
他们在考虑增加一个?操作员对C#4.0做同样的事情,但是得到了斩波块.
与此同时,还有IfNotNull()有哪些划痕痒.它肯定比大?或者:但它确实允许你编写一系列操作,如果其中一个成员为null,则不会对你造成NullReferenceException.
| 归档时间: |
|
| 查看次数: |
12381 次 |
| 最近记录: |