看到类似的问题后,我想知道以下表达是否......
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 中关闭),则每次计算时的值可能会不同,因此两个代码段不同,原因与上一段中所述的原因相同。