文檔非常清晰地表示了一個密閉類不能被進一步擴展或子類 化。在這個例子中,我們希望看到一個錯誤但是什麼也不會生成。必須提醒你的是,我們現在使用的是 beta版本。下一個版本可能會生成一個錯誤。
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (class yyy V_0)
newobj instance void yyy::.ctor()
stloc.0
ret
}
}
.class private auto ansi abstract yyy
{
}
抽象類不能被直接使用。只 能從中派生。上面的代碼應該生成一個錯誤,但並不是這樣。
a.cs
public class zzz
{
const int i = 10;
public static void Main()
{
System.Console.WriteLine(i);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.s 10
call void [mscorlib]System.Console::WriteLine(int32)
ret
ret
}
}
Output
10
常量是只存在於編譯期間的一個實體。它在運行期間是不可 見的。這就證實了編譯器會移除對編譯期間對象的所有跟蹤。在轉換到IL的過程中,在C#中出現的所有 int i都會被數字10取代。
a.cs
public class zzz
{
const int i = j + 4;
const int j = k - 1;
const int k = 3;
public static void Main()
{
System.Console.WriteLine(k);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.fIEld private static literal int32 i = int32(0x00000006)
.fIEld private static literal int32 j = int32(0x00000002)
.fIEld private static literal int32 k = int32 (0x00000003)
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldc.i4.3
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
}
Ouput
3