1 回答
TA贡献1796条经验 获得超4个赞
在第一种情况下,我每次调用f()都会实例化变量吗?还是在编译期间仅实例化一次?
最简单的方法是尝试一下。例如,编译以下代码:
using System;
class Test
{
const int ClassConst = 10;
static void PrintLocalConst()
{
const int LocalConst = 10;
Console.WriteLine(LocalConst);
Console.WriteLine(LocalConst);
}
static void PrintClassConst()
{
Console.WriteLine(ClassConst);
Console.WriteLine(ClassConst);
}
}
两种方法都编译为相同的IL:
.method private hidebysig static void PrintLocalConst() cil managed
{
// Code size 18 (0x12)
.maxstack 8
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: call void [mscorlib]System.Console::WriteLine(int32)
IL_0008: nop
IL_0009: ldc.i4.s 10
IL_000b: call void [mscorlib]System.Console::WriteLine(int32)
IL_0010: nop
IL_0011: ret
} // end of method Test::PrintLocalConst
堆栈上没有局部常数的值。取而代之的是,每次使用时,常数值都直接包含在IL中-因此会ldc.i4.s 10被使用两次。
就此而言,局部const比类const的效率非常非常非常高,因为类const仍在IL中表示。本地const有效地被编译器完全删除了。但是,IL表示形式中的常量的几个字节几乎不可能是有效的。(它不是按对象或方法调用分配的。)
- 1 回答
- 0 关注
- 251 浏览
添加回答
举报