安全且正确地从Nullable中提取值
本文关键字:提取 Nullable 正确地 安全 | 更新日期: 2023-09-27 18:09:36
可能重复:
首选项:Nullable<gt;。HasValue或Nullable<gt;==无效的
我正在使用一个代码库,它使用以下两种形式来"安全"地从Nullable类型中获取值。例如,如果foo
是可为null的(int?(:
if (foo != null) {
value = (int)foo;
}
if (foo.HasValue) {
value = foo.Value;
}
我更喜欢第二种形式,但有没有任何特定的背景可以使第一种(或第二种,就这一点而言(肯定比另一种更受欢迎?
第一个和第二个完全等价,并编译到相同的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合并运算符-虽然Anton的代码与您的代码不等价,但它是一个您绝对应该熟悉的运算符,因为它确实可以生成漂亮的代码。
我倾向于使用第二种形式,因为它代表了Nullable的实际含义——一个有两个成员的结构。
我个人更喜欢
var value = foo ?? 0;