【发布时间】:2017-04-20 00:07:18
【问题描述】:
看到一个similar question后,想知道是不是下面这个表达式……
if (attribute != null && attribute.Description == input)
... 与以下空传播变体的行为(几乎)相同?
if (attribute?.Description == input)
到目前为止,我只能确定以下(有些细微的)差异:
- 如果
input是不可为空的类型,则不可能 - 如果
input本身就是null,则行为将被改变
我错过了什么吗?还是有其他行为上的差异?
编辑:最后,我为第一个 sn-p 找到的唯一故障安全替代方案是:
if (attribute?.Description?.Equals(input) ?? false)
【问题讨论】:
-
attribute在第二种情况下只被评估一次,所以你永远不会得到NullReferenceException。在第一种情况下,如果attribute在评估第一个条件之后但在评估第二个之前从非 null 更改为 null,您仍然会看到异常... -
如果您不想让
input成为null,您应该先检查一下。那么就没有区别了,因为可以将 nullable 与 non-nullable 进行比较。 -
@TimSchmelter 这实际上对您没有帮助。关键是当
input为空时,两个 sn-ps behave 不同,并且它们这样做的方式是,对于第二个 sn-p,您不能只检查它第一的;如果允许input为null,则您需要将第二个 sn-p 重构为类似于第一个的东西,以便它返回正确的结果。 -
在得到问题的答案后,您不应该更改问题的内容。
-
@Servy 好的,很抱歉。我想保留一个更新的列表,在哪里添加/删除差异。还认为如果他们不阅读答案,列表中的第一个错误陈述可能会误导其他人。感谢您的提示!
标签: c# null language-features c#-6.0 null-propagation-operator