哪个更好?使用Value属性转换为nullable类型还是检索值?

时间:2011-08-19 02:30:43

标签: c# .net nullable

单向另一种方式是否有性能优势?

是否有其他理由选择其中一个?

3 个答案:

答案 0 :(得分:38)

  

单向另一种方式是否有性能优势?

没有。它们都编译成完全相同的IL。演员阵容是Value属性的语法糖。这段代码:

int? x = null;
Console.WriteLine(x.Value);
Console.WriteLine((int)x);

编译这些IL指令,忽略nop :(您可以使用ildasm,ILSpy,DotPeek等自行测试)

// int? x = null;
ldloca.s 0
initobj valuetype [mscorlib]System.Nullable`1<int32>

// Console.WriteLine(x.Value);
ldloca.s 0
call instance !!0 [mscorlib]System.Nullable`1<int32>::get_Value()
call void [mscorlib]System.Console::WriteLine(int32)

// Console.WriteLine((int)x);
ldloca.s 0
call instance !!0 [mscorlib]System.Nullable`1<int32>::get_Value()
call void [mscorlib]System.Console::WriteLine(int32)
  

是否有其他理由选择其中一个?

我希望尽可能避免使用强制转换,因为它们总是有可能与实际类型不同步。如果我将变量从int?更改为byte?,那么我的所有演员都是错误的 - 但如果我使用.Value,我可以根据需要自由更改变量。对我而言,硬性演员在可读性方面没有增加任何内容,但在可维护性方面确实有所成本。

答案 1 :(得分:9)

  

单向另一种方式是否有性能优势?

表现可以忽略不计

  

是否有其他理由选择其中一个?

可读性?


// most readable
public int GetValue(int? value)
{
    return value.GetValueOrDefault();
}

// less readable
public int GetValue(int? value)
{
    return value ?? default(int);
}

// least readable
public int GetValue(int? value)
{
    return value.HasValue ? value.Value : default(int);
}

//least readable reversed return type/param type
public int? GetValue(int value)
{
    return value == 0 ? null : (int?)value;
}

答案 2 :(得分:4)

(老问题?谁在乎。当代问题。)

首先,Joe provides a great answer,并且考虑到C#的当前状态,我想我同意他的观点:

  

......他们可能与实际类型不同步。如果我   从int改变我的变量?到字节?,然后我所有的演员都错了 -   但如果我使用.Value,我可以自由地将变量更改为   必要的。

问题在于总是正在提交某个类型,因为如果您使用.Value,那么您将致力于Nullable<TAny>并且如果您正在使用演员表'承诺“ICastableTo<TSpecific>组成名称

那就是说,Joe的建议仍然有效,因为编译器在捕获无效.Value用法方面要比可能仍然编译的潜在语义无效的强制转换更好,并且你希望编译器能够捕获尽可能多的改变类型时的东西