Joe*_*ite 39
一种方式比另一种方式有性能优势吗?
不,他们都编译成完全相同的IL.演员阵容是Value属性的语法糖.这段代码:
int? x = null;
Console.WriteLine(x.Value);
Console.WriteLine((int)x);
Run Code Online (Sandbox Code Playgroud)
编译这些IL指令,忽略nops :(你可以使用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)
Run Code Online (Sandbox Code Playgroud)
还有其他理由选择其中一个吗?
我希望尽可能避免使用强制转换,因为它们总是有可能与实际类型不同步.如果我将变量更改int?为byte?,那么我的所有演员都是错的 - 但如果我使用.Value,我可以根据需要随意更改变量.对我而言,硬性演员在可读性方面没有增加任何内容,但在可维护性方面确实有所成本.
一种方式比另一种方式有性能优势吗?
表现可以忽略不计
还有其他理由选择其中一个吗?
可读性?
// most readable
public int GetValue(int? value)
{
return value.GetValueOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
// less readable
public int GetValue(int? value)
{
return value ?? default(int);
}
Run Code Online (Sandbox Code Playgroud)
// least readable
public int GetValue(int? value)
{
return value.HasValue ? value.Value : default(int);
}
Run Code Online (Sandbox Code Playgroud)
//least readable reversed return type/param type
public int? GetValue(int value)
{
return value == 0 ? null : (int?)value;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4153 次 |
| 最近记录: |