看到一个类似的问题,我想知道以下表达式是否...
if (attribute != null && attribute.Description == input)
...与以下零传播变体的行为(几乎)相同?
if (attribute?.Description == input)
到目前为止,我只能确定以下(某种程度上较小的)差异:
- 万一不可能
input
是不可为 null 的类型
- in case
input
将是其本身null
,行为将会改变
我错过了什么吗?还是有其他差异在行为上?
EDIT:最后,我为第一个片段找到的唯一安全替代方案是:
if (attribute?.Description?.Equals(input) ?? false)
代码will工作如果input
是不可为 null 的类型。所有不可为空类型都会隐式转换为其可空对应类型,因此input
将简单地提升为可空值以与属性值进行比较。
正如您提到的,行为上的唯一区别是,如果input
is null
,那么第二个片段无法区分attribute
being null
,当它应该是false
,以及哪里Description
is null
,它应该在哪里true
.
哦,这是假设attribute
是局部变量或字段。如果它是一个属性(或者实际上是一个更复杂的表达式),那么它可能会产生副作用,或者在计算两次时产生不同的值,就像第一个片段中发生的情况,但第二个片段中则不然,这是行为上的差异。
当然,这都是假设单线程上下文的。在多线程环境中,如果attribute
可以从另一个线程访问(因为它是一个可访问的字段,或者因为它在暴露给另一个线程的 lambda 中封闭),那么每次计算时该值可能不同,因此这两个片段出于相同原因而不同上一段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)