早上好,下午或晚上,
MSIL或JIT编译器将分别用1 << 5
和1 << 31
替换代码中的32
或2147483648
等内容,还是等待方法执行“及时”评估这些常数,因为它们涉及其他方法(运算符)?
非常感谢。
答案 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:可以的值 在编译时计算。一个 常量声明引入一个或 更多给定类型的常量。