【问题标题】:Calculated Constants in C#C# 中的计算常量
【发布时间】:2011-07-19 18:13:10
【问题描述】:

早上好,下午好,晚上好,

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

非常感谢。

【问题讨论】:

  • 这取决于上下文,但大多数情况下它们将在编译时进行评估。
  • 这些是comile时间常数->在comile时间评估

标签: c# operators jit cil


【解决方案1】:

试试看。

以下代码

    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。

【讨论】:

【解决方案2】:

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

10.4 常量

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

【讨论】:

  • 这并不是说它一定是这样编译的。如果您编写了一个在运行时进行计算的 C# 编译器,那么您仍然符合该规范的规定。
【解决方案3】:

是的。查看编译后的 IL 以查找仅执行 Console.WriteLine(1 &lt;&lt; 5) 的程序,您会发现它与 Console.WriteLine(32)Console.WriteLine(0x20) 的程序相同。这同样适用于许多其他此类常量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2013-01-23
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多