【问题标题】:Assigning a constant cast to a var in C#在 C# 中将常量强制转换分配给 var
【发布时间】:2013-05-11 15:49:52
【问题描述】:

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 生成的汇编代码?

【问题讨论】:

  • 我很确定var 是在编译时计算的(至少是类型)。相对于dynamic
  • 1) 代码不会编译,因为您正在重新定义x。给每一行一个不同的变量名。 2) 修复 #1 后,程序将可编译。与其向我们询问 a、b、c 和 d,不如自己编译程序并找出答案?会比在这里提问更快更容易。
  • @Jon 是的,已经编辑过 ;)
  • 对不起,我没有提到这些行不是程序的一部分。我只是在这些方法之间进行比较。

标签: c# variables casting compiler-optimization var


【解决方案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] 

【讨论】:

  • 我也是,vs2012 +1(不需要外部工具)
【解决方案2】:

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

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

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

【讨论】:

  • 很好的答案,我使用 LINQPad,但我从未注意到这个功能,它真的很容易使用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-16
  • 2018-05-12
  • 2013-12-11
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多