将null转换为某些东西?

Bul*_*ull 5 .net c# dbnull casting nullable

今天我和一位同事进行了这次有趣的讨论.我们在C#中讨论两段代码.

代码片段1:

if(!reader.IsDBNull(2))
{
  long? variable1 = reader.GetInt64(2)
}
Run Code Online (Sandbox Code Playgroud)

代码片段2:

long variable1 = reader.IsDBNull(2) ? (long?) null : reader.GetInt64(2)
Run Code Online (Sandbox Code Playgroud)

问题是:将null转换为可空的long是一个好习惯吗?或者你宁愿使用传统的if语句来避免强制转换null为可空的长.

Wor*_*mbo 15

的表达(type?)null,default(type?)new Nullable<type>()最终被编译成相同的操作码:

        long? x = (long?)null;
        long? y = default(long?);
        long? z = new Nullable<long>();
Run Code Online (Sandbox Code Playgroud)

变成了:

    IL_0001: ldloca.s x
    IL_0003: initobj valuetype [mscorlib]System.Nullable`1<int64>
    IL_0009: ldloca.s y
    IL_000b: initobj valuetype [mscorlib]System.Nullable`1<int64>
    IL_0011: ldloca.s z
    IL_0013: initobj valuetype [mscorlib]System.Nullable`1<int64>
Run Code Online (Sandbox Code Playgroud)

换句话说,如果您正在使用可空类型,您可以自由使用您最喜欢的版本.但请注意,您应该尽量避免使用可空类型的算术.如果要从条件表达式返回可为空的值,则如果其中一个可以为null,则两个可能的结果必须是可为空的.在这种情况下,任何其他方式都可能导致异常.