空传播更换空检查之前,条件语句
看到similar question后,我在想,如果下面的表达式...空传播更换空检查之前,条件语句
if (attribute != null && attribute.Description == input)
...会表现(几乎)完全相同,下面空传播变种?
if (attribute?.Description == input)
到目前为止,我只能确定如下(以某种方式影响不大):
- 不可能的情况下
input
非可空类型的情况下input
- 将自身
null
,行为将被改变
我错过了什么吗?或者是否存在其他差异的行为?
编辑:到底,唯一的错误保护替我找到了第一个片段,将是:
if (attribute?.Description?.Equals(input) ?? false)
代码将工作,如果input
是一个不可空的类型。有一个隐式转换所有不可为空的类型到它们的可空对象,所以input
将被简单地提升到可以为空来与属性值进行比较。
行为的唯一区别,正如你提到的是,如果input
是null
,那么第二个片段有没有办法attribute
之间的区别是null
的,当它应该是false
,并在Description
是null
,它应该是true
。
哦,这是假设attribute
是一个局部变量或字段。如果它是一个属性(或者实际上是一个更复杂的表达式),那么它在计算两次时可能会产生副作用或产生不同的值,就像在第一个片段中发生的那样,而不是在第二个片断中发生,这是行为上的差异。
这当然假定单线程上下文。在多线程上下文中,如果attribute
可以从另一个线程访问(或者因为它是一个可访问的字段,或者因为它在暴露给另一个线程的lambda中被关闭),那么每次计算它的值可能会不同,所以这两个片段因前段所述的相同原因而不同。
你怎么知道它从不'空'?处理合同? – Mafii
在我的情况下,输入来自预定义的配置文件。 –
'attribute'只在第二种情况下评估一次,所以你永远不会得到'NullReferenceException'。在第一种情况下,如果'属性'在评估第一个条件之后但在评估第二个条件之前从非null更改为null,则仍然会看到一个例外... –
如果您不想要允许'input'为'null',你应该首先检查它。那么没有什么区别,因为可以将空值与不可空值进行比较。 –
@TimSchmelter这实际上并没有帮助你。问题的关键在于,当“输入”为空时,这两个代码片段*的行为不同,并且它们以这样的方式执行:对于第二个代码片段,您不能仅仅先检查它;您需要将第二个代码片段重构为与第一个片段类似的东西,以便在“input”被允许为“null”的情况下返回正确的结果。 – Servy