C#编译器是否转换和存储静态变量?

C#编译器是否转换和存储静态变量?,c#,compiler-construction,C#,Compiler Construction,我的程序使用以下代码: Convert.ToDouble(Int32.MaxValue) 相当经常。我只是好奇编译器是如何处理这个问题的。它是存储为静态双精度还是在运行时执行?常量Int32.MaxValue是在编译时存储的,事实上,您的代码将在编译时转换为Convert.ToDouble(0x7FFFFFFF)。等效IL为: ldc.i4 FF FF FF 7F call System.Convert.ToDouble ldc.r8 00 00 C0 F

我的程序使用以下代码:

Convert.ToDouble(Int32.MaxValue)

相当经常。我只是好奇编译器是如何处理这个问题的。它是存储为静态双精度还是在运行时执行?

常量
Int32.MaxValue
是在编译时存储的,事实上,您的代码将在编译时转换为
Convert.ToDouble(0x7FFFFFFF)
。等效IL为:

ldc.i4      FF FF FF 7F 
call        System.Convert.ToDouble
ldc.r8      00 00 C0 FF FF FF DF 41 
此值也会保存,以便在运行时通过反射检索

但是,
Convert.ToDouble
是一个仅在运行时计算的函数

正如minitech建议的那样,
(double)Int32.MaxValue
在编译时进行计算。等效IL为:

ldc.i4      FF FF FF 7F 
call        System.Convert.ToDouble
ldc.r8      00 00 C0 FF FF FF DF 41 

为什么不
(double)Int32.MaxValue
?您推荐了解IL的任何资源?我目前对这件事一无所知it@ThomasFarley也许没有比写一些C#,下载像ILSpy这样的免费反编译程序,查看IL:)@CuongLe更好的学习方法了。这正是我大部分时间使用的,包括回答这个问题。