空值传播替换 null 检查前置条件语句



看到类似的问题后,我想知道以下表达是否......

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

。行为(几乎)与以下零传播变体相同吗?

if (attribute?.Description == input)

到目前为止,我只能确定以下(不知何故很小)的差异:

  • 如果input是不可为空的类型,则不可能
  • 如果input本身null,行为将被改变

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


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

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

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

正如你提到的,行为上唯一的区别是,如果inputnull,那么第二个片段无法区分attributenull,什么时候应该false,以及Description在哪里null,在哪里应该true

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

当然,这一切都是假设单线程上下文。 在多线程上下文中,如果可以从另一个线程访问attribute(因为它是可访问的字段,或者因为它在向另一个线程公开的 lambda 中关闭),则每次计算时的值可能会不同,因此两个代码段不同,原因与上一段中所述的原因相同。

相关内容

  • 没有找到相关文章

最新更新