可能重复:
Which is preferred: Nullable<>.HasValue or Nullable<> == null?
我正在使用以下两种形式的代码库,以“安全地”从Nullable类型中获取值。例如,如果foo
是Nullable(int?):
if (foo != null) {
value = (int)foo;
}
if (foo.HasValue) {
value = foo.Value;
}
我更喜欢第二种形式,但有没有任何特定的背景可能会使第一种(或第二种,相比之下)肯定优先于另一种形式?
答案 0 :(得分:3)
第一个和第二个完全等价,并编译为相同的IL。
编辑:他们确实生成了相同的IL,如下所示: IL_000b: ldloca.s V_1
IL_000d: call instance bool valuetype
[mscorlib]System.Nullable`1<int32>::get_HasValue()
IL_0012: ldc.i4.0
IL_0013: ceq
IL_0015: stloc.2
IL_0016: ldloc.2
IL_0017: brtrue.s IL_0023
IL_0019: nop
IL_001a: ldloca.s V_1
IL_001c: call instance !0 valuetype
[mscorlib]System.Nullable`1<int32>::get_Value()
IL_0021: stloc.0
这由C#4规范的7.10.9节(或其他版本的等效规范)保证。
基本上 - 使用您和您的团队认为更具可读性的任何形式。
Anton强调null-coalescing operator - 而Anton的代码与你的代码不同,它是一个你绝对应该熟悉的运算符,因为它可以真正实现漂亮的代码。
答案 1 :(得分:2)
我倾向于使用第二种形式,因为它代表了Nullable实际上是什么 - 一个有两个成员的结构。
答案 2 :(得分:1)
我个人更喜欢
var value = foo ?? 0;