C#编译器有多聪明,给出以下内容:
float a = 1; //A
var b = 1f; //B
var c = (float)1; //C - Is this line equivalent to A and B?
var d = Convert.ToSingle(1); //D - Is this line equivalent to A and B?
据我所知,编译后A和B是等价的。其他线路怎么样?
C和D在编译时是否优化为等同于A和B,或者它们是否仅在运行时分配,导致更多处理来执行分配?
我认为必须优化铸造(C)并且不得使用功能(D)。
在任何情况下,我如何使用VS2012调查和比较生成的汇编代码?
答案 0 :(得分:4)
三条第一条线是等价的;事实上,他们编译成相同的IL(至少使用我使用的.NET 4编译器)。
第四个是通过调用方法执行的运行时转换,这是一个完全不同的野兽。
关于生成的IL的检查,请查看A tool for easy IL code inspection。
答案 1 :(得分:1)
我如何使用调查和比较生成的汇编代码 VS2012?
“Go To Assembly”(或按 CTRL + ALT + D )
答案如下......
float x = 1; //A
00000061 fld1
00000063 fstp dword ptr [ebp-40h]
var x1 = 1f; //B
00000066 fld1
00000068 fstp dword ptr [ebp-44h]
var x2 = (float)1; //C - Is this line equivalent to A and B?
0000006b fld1
0000006d fstp dword ptr [ebp-48h]
var x3= Convert.ToSingle(1); //D - Is this line equivalent to A and B?
00000070 mov ecx,1
00000075 call 5FB7A2DC
0000007a fstp dword ptr [ebp-50h]
0000007d fld dword ptr [ebp-50h]
00000080 fstp dword ptr [ebp-4Ch]