所有的常量都是由編譯器計算的,即使它們 可能關聯到其它常量,但它們會被設定為一個絕對的值。IL運行時不會為文本字段分配任何內存。這涉及 到元數據的領域,稍後我們將對其分析。
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.fIEld private static literal int32 i = int32(0x00000006)
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.6
stsfld int32 zzz::i
ret
}
}
Output
Exception occurred: System.MissingFIEldException: zzz.i
at zzz.vijay()
文本字段表示一個常量值。在IL中,不允許訪問任何文本字段。編 譯器在編譯期間不會生成任何錯誤,但是在運行期間會拋出一個異常。我們希望一個編譯期間錯誤,因為 我們在指令stsfld中使用了一個文本字段。
a.cs
public class zzz
{
public static readonly int i = 10;
public static void Main()
{
System.Console.WriteLine(i);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.fIEld public static initonly int32 i
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldsfld int32 zzz::i
call void [mscorlib] System.Console::WriteLine(int32)
ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.s 10
stsfld int32 zzz::i
ret
}
}
Output
10