我认为 C# 语言真的可以为这种逻辑使用一个新的运算符——这很常见,一个运算符可以简化无数行代码。
我们需要类似“??”的东西。或 "if null then" 运算符,但它作为特殊的 '.' 工作。带有“if not null”条件的点运算符。为了第一 '?' 就像 "?:" if-then 的 'if' 部分和第二个 '?' 表示“null”,如可空类型。我认为我们需要一个“.?” 运算符的工作方式与“.”类似,但如果左表达式为 null 而不是抛出异常,则它只是简单地计算为 null。我想这将是一个“dot not null”运算符(好吧,所以也许“.!?”会更合乎逻辑,但我们不要去那里)。
因此,您非常常见的示例可能会丢失这样的冗余符号名称:
var a = long_expression.?Method();
有大量的 C# 代码带有嵌套的空检查,这将大大受益。想想如果这样会多好:
if (localObject != null)
{
if (localObject.ChildObject != null)
{
if (localObject.ChildObject.ChildObject != null)
localObject.ChildObject.ChildObject.DoSomething();
}
}
可能会变成:
localObject.?ChildObject.?ChildObject.?DoSomething();
还有大量代码缺少应该存在的空检查,从而导致偶尔的运行时错误。所以,实际上使用新的'.?' 默认情况下,运算符将消除此类问题...不幸的是,我们无法逆转 '.' 的行为。和 '。?' 在这一点上,所以只有新的 '.?' 如果左侧为空,则抛出异常 - 这将是更清洁和更合乎逻辑的方式,但破坏性更改非常糟糕。虽然,有人可能会争辩说,这种特殊的变化可能会解决很多隐藏的问题,并且不太可能破坏任何东西(只有期望抛出 null ref 异常的代码)。哦,好吧……一个人总能做梦……
检查空值的唯一缺点实际上是对性能的轻微影响,这就是为什么 '.' 的原因。不检查空值。但是,我真的认为只使用 '.?' 的能力 当您关心性能时(并且知道左侧永远不会为空)会是更好的选择。
在类似的说明中,让“foreach”检查并忽略空集合也会好得多。不再需要用“if (collection != null)”来包装大多数“foreach”语句,或者更糟的是,养成始终使用空集合而不是 null 的习惯……这在某些情况下很好,但更糟糕的是在大多数集合为空的复杂对象树中执行此操作时,与空值检查相比,性能问题是空的(我见过很多)。我认为在大多数情况下,不让“foreach”检查 null 以提供更好的性能的良好意图适得其反。
Anders,做出这样的改变永远不会太晚,并添加一个编译器开关来启用它们!