空检查先验条件语句的空传播替换
Null-propagation replacement for null check prior conditional statement
看到一个similar question后,我想知道下面的表达式是不是...
if (attribute != null && attribute.Description == input)
... 的行为(几乎)与以下空传播变体相同?
if (attribute?.Description == input)
到目前为止,我只能确定以下(有点小)差异:
- 不可能
input
是不可空类型
- 万一
input
是它自己 null
,行为会改变
我错过了什么吗?还是在行为上有其他差异?
编辑: 最后,我为第一个片段找到的唯一安全替代方案是:
if (attribute?.Description?.Equals(input) ?? false)
如果 input
是不可空类型,代码 将 起作用。所有不可为 null 的类型都隐式转换为它们的可为 null 的对应类型,因此 input
将简单地提升为 nullable 以与 属性 值进行比较。
正如您提到的,行为上的唯一区别是,如果 input
是 null
,则第二个片段无法区分 attribute
和 null
],当它应该是 false
,而 Description
是 null
,它应该是 true
。
哦,这是假设 attribute
是局部变量或字段。如果它是一个 属性 (或者实际上是一个更复杂的表达式),那么它可能会产生副作用或在计算两次时产生不同的值,就像第一个片段而不是第二个片段中发生的那样,这是行为上的差异.
这当然是假设单线程上下文。在多线程上下文中,如果 attribute
可从另一个线程访问(因为它是一个可访问的字段,或者因为它在暴露给另一个线程的 lambda 中被关闭),那么每次计算时该值都可能不同,所以这两个片段因上一段中描述的相同原因而不同。
看到一个similar question后,我想知道下面的表达式是不是...
if (attribute != null && attribute.Description == input)
... 的行为(几乎)与以下空传播变体相同?
if (attribute?.Description == input)
到目前为止,我只能确定以下(有点小)差异:
- 不可能
input
是不可空类型 - 万一
input
是它自己null
,行为会改变
我错过了什么吗?还是在行为上有其他差异?
编辑: 最后,我为第一个片段找到的唯一安全替代方案是:
if (attribute?.Description?.Equals(input) ?? false)
如果 input
是不可空类型,代码 将 起作用。所有不可为 null 的类型都隐式转换为它们的可为 null 的对应类型,因此 input
将简单地提升为 nullable 以与 属性 值进行比较。
正如您提到的,行为上的唯一区别是,如果 input
是 null
,则第二个片段无法区分 attribute
和 null
],当它应该是 false
,而 Description
是 null
,它应该是 true
。
哦,这是假设 attribute
是局部变量或字段。如果它是一个 属性 (或者实际上是一个更复杂的表达式),那么它可能会产生副作用或在计算两次时产生不同的值,就像第一个片段而不是第二个片段中发生的那样,这是行为上的差异.
这当然是假设单线程上下文。在多线程上下文中,如果 attribute
可从另一个线程访问(因为它是一个可访问的字段,或者因为它在暴露给另一个线程的 lambda 中被关闭),那么每次计算时该值都可能不同,所以这两个片段因上一段中描述的相同原因而不同。