2

鉴于以下情况,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 调查和比较生成的汇编代码?

4

2 回答 2

4

前三行是等价的;事实上,它们编译成相同的 IL(至少使用我使用的 .NET 4 编译器)。

第四种是调用方法进行的运行时转换,是完全不同的野兽。

关于生成的 IL 的检查,请看A tool for easy IL code 检查

于 2013-05-16T16:30:08.923 回答
1

如何使用 VS2012 调查和比较生成的汇编代码?

“转到装配”(或按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] 
于 2013-05-16T16:33:39.490 回答