【发布时间】:2017-08-21 12:03:04
【问题描述】:
我一直在玩 C# 6 的空条件运算符 (more info here)。
我真的很喜欢这种语法,我认为它使代码更具可读性,但是我认为当您遇到检查对象上的属性值时,代码究竟会做什么是值得怀疑的,而对象本身可能为空。
例如,如果我有一个带有小数属性的类,并且我想对该小数的值进行条件检查,我会写如下内容:
if (foo?.Bar > max)
{
// do something
}
表面上看起来很棒...如果 foo 不为 null,则获取 Bar 的值并检查它是否大于最大值,如果是,则执行一些操作。
但是,如果 foo 为空怎么办?!
This documentation about the new and improved features of C# 6 这样说:
如果实际上对象的值为空,则空条件 运算符将返回 null。它使对 Bar 的调用短路,并且 立即返回 null,避免编程错误 否则会导致 NullReferenceException。
我写了一个小提琴here,它表明它确实有效并且正在做我期望它做的事情,但是我无法理解它是如何决定条件结果的。
短路如何等于假?在我的脑海中,这段代码现在会说“如果 foo 为 null,检查 null 是否 > max,这是不可能的,所以返回 false”或“如果 foo 为 null,那么 foo != null 将返回 false,所以你得到a false" 但是文档说 null 条件检查返回 null,而不是 false。
【问题讨论】:
-
有趣的是,无论条件是
(bar > max)还是(bar <= max),它都不会运行do something。所以基本上,条件中的null值将始终评估为false,无论实际条件是什么。 -
如果 foo 为空,您应该使用
(foo?.Bar).GetValueOrDefault(2)设置用于比较的值。我指定了“2”,但如果你省略参数,它默认为零。
标签: c# c#-6.0 null-conditional-operator