空检查先验条件语句的空传播替换

Null-propagation replacement for null check prior conditional statement

看到一个similar question后,我想知道下面的表达式是不是...

if (attribute != null && attribute.Description == input)

... 的行为(几乎)与以下空传播变体相同?

if (attribute?.Description == input)

到目前为止,我只能确定以下(有点小)差异:

我错过了什么吗?还是在行为上有其他差异


编辑: 最后,我为第一个片段找到的唯一安全替代方案是:

if (attribute?.Description?.Equals(input) ?? false)

如果 input 是不可空类型,代码 起作用。所有不可为 null 的类型都隐式转换为它们的可为 null 的对应类型,因此 input 将简单地提升为 nullable 以与 属性 值进行比较。

正如您提到的,行为上的唯一区别是,如果 inputnull,则第二个片段无法区分 attributenull ],当它应该是 false,而 Descriptionnull,它应该是 true

哦,这是假设 attribute 是局部变量或字段。如果它是一个 属性 (或者实际上是一个更复杂的表达式),那么它可能会产生副作用或在计算两次时产生不同的值,就像第一个片段而不是第二个片段中发生的那样,这是行为上的差异.

这当然是假设单线程上下文。在多线程上下文中,如果 attribute 可从另一个线程访问(因为它是一个可访问的字段,或者因为它在暴露给另一个线程的 lambda 中被关闭),那么每次计算时该值都可能不同,所以这两个片段因上一段中描述的相同原因而不同。