单向另一种方式是否有性能优势?
是否有其他理由选择其中一个?
答案 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
用法方面要比可能仍然编译的潜在语义无效的强制转换更好,并且你希望编译器能够捕获尽可能多的改变类型时的东西。