C#中的计算常量

时间:2011-03-21 14:54:33

标签: c# operators jit cil

早上好,下午或晚上,

MSIL或JIT编译器将分别用1 << 51 << 31替换代码中的322147483648等内容,还是等待方法执行“及时”评估这些常数,因为它们涉及其他方法(运算符)?

非常感谢。

3 个答案:

答案 0 :(得分:6)

试试吧。

以下代码

    static void Main ( string[] args )
    {
        Console.WriteLine ( 1 << 4 );
    }

获取编译为

  IL_0000:  nop
  IL_0001:  ldc.i4.s   16
  IL_0003:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0008:  nop
  IL_0009:  ret

它只加载常量16并将其传递给WriteLine。

答案 1 :(得分:5)

是。查看已编译的IL以查找仅Console.WriteLine(1 << 5)的程序,您将看到它与Console.WriteLine(32)Console.WriteLine(0x20)的相同。这同样适用于许多其他类似的常量。

答案 2 :(得分:3)

(已测试) - 它们确实在编译后产生相同的计算值,C#规范确认:

  

10.4常数

     

常量是表示常量的类成员   value:可以的值   在编译时计算。一个   常量声明引入一个或   更多给定类型的常量。