假设value
是object
类型,并且永远只有null
、true
或false
的值,以下两个表达式的(A)行为和(B)执行之间是否有任何区别:
// Expression 1
value == null ? false : (bool) value
// Expression 2
(bool?) value == true
假设value
是object
类型,并且永远只有null
、true
或false
的值,以下两个表达式的(A)行为和(B)执行之间是否有任何区别:
// Expression 1
value == null ? false : (bool) value
// Expression 2
(bool?) value == true
如果object value
只能包含null
、true
或false
,它们将返回相同的结果.然而,第二个(不出所料)更贵:
表达式1:
IL_0008: ldloc.0
IL_0009: brfalse.s IL_0013
IL_000b: ldloc.0
IL_000c: unbox.any [System.Runtime]System.Boolean
IL_0011: br.s IL_0014
表达式2:
IL_0008: ldloc.0
IL_0009: unbox.any valuetype [System.Runtime]System.Nullable`1<bool>
IL_000e: stloc.2
IL_000f: ldc.i4.1
IL_0010: stloc.3
IL_0011: ldloca.s 2
IL_0013: call instance !0 valuetype [System.Runtime]System.Nullable`1<bool>::GetValueOrDefault()
IL_0018: ldloc.3
IL_0019: ceq
IL_001b: ldloca.s 2
IL_001d: call instance bool valuetype [System.Runtime]System.Nullable`1<bool>::get_HasValue()
IL_0022: and
IL_0023: stloc.1
The value is true
version mentioned in the comments is almost the same as 表达式1:
IL_0008: ldloc.0
IL_0009: isinst [System.Runtime]System.Boolean
IL_000e: brfalse.s IL_0018
IL_0010: ldloc.0
IL_0011: unbox.any [System.Runtime]System.Boolean
IL_0016: br.s IL_0019
它还有一个额外的好处,那就是可以容忍value
中的其他类型的值,而不仅仅是null
、true
或false
.