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更好的学习方法了。这正是我大部分时间使用的,包括回答这个问题。