1 回答

TA貢獻1796條經(jīng)驗 獲得超4個贊
在第一種情況下,我每次調(diào)用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
堆棧上沒有局部常數(shù)的值。取而代之的是,每次使用時,常數(shù)值都直接包含在IL中-因此會ldc.i4.s 10被使用兩次。
就此而言,局部const比類const的效率非常非常非常高,因為類const仍在IL中表示。本地const有效地被編譯器完全刪除了。但是,IL表示形式中的常量的幾個字節(jié)幾乎不可能是有效的。(它不是按對象或方法調(diào)用分配的。)
- 1 回答
- 0 關(guān)注
- 271 瀏覽
添加回答
舉報