在C#中为var分配一个常量强制转换

时间:2013-05-16 16:25:38

标签: c# variables casting compiler-optimization var

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调查和比较生成的汇编代码?

2 个答案:

答案 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]