3

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

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

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

if (attribute?.Description == input)

到目前为止,我只能确定以下(某种程度上)差异:

  • input如果是不可为空的类型,则不可能
  • 万一input是它自己null,行为就会改变

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


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

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

1 回答 1

4

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

正如您所提到的,行为上的唯一区别是,如果inputnull,那么第二个片段无法区分存在attributenull何时应该是,false以及在哪里,应该在哪里。Descriptionnulltrue

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

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

于 2016-12-05T14:52:29.183 回答