我們只創建了一個對象,它是類bb的一個實例。有3個構造函數會被調用,而不是2個構造函數 (一個是基類的,一個是派生類的)。
l 在IL中,首先,會調用沒有參數的構造函數。
l 然後,當到達構造函數bb時,就會對相同類的另一個帶有參數值20的構造函數進行調用。This(20)會被轉 換為對一個實際的帶有一個參數的構造函數的調用。
l 現在,我們轉移到bb的一個構造函數上。 這裡,初始化對aa的一個構造函數的調用,被作為需要首先被調用的基類的構造函數。
幸運的是 ,aa的基類構造函數不會使我們徒勞無功。在它完成執行之後,就會顯示這個字符串,而最後,bb的無參 構造函數會被調用。
因此,base和this在IL中是不存在的,它們是編譯期間被硬編譯到IL代碼中 的“赝品”。
a.il
.assembly mukhi {}
.class private auto ansi zzz extends [mscorlib]System.Object
{
.method public hidebysig static void vijay() il managed
{
.entrypoint
.locals (class aa V_0)
newobj instance void aa::.ctor()
ret
}
}
.class public auto ansi aa extends [mscorlib] System.Object
{
.method private hidebysig specialname rtspecialname instance void .ctor() il managed
{
ret
}
}
Output
Exception occurred: System.MethodAccessException: aa..ctor()
at zzz.vijay()
我們不能在類的 外部訪問它的私有成員。因此,正如我們在類bb中創建唯一的私有構造函數那樣,我們不能創建任何看上 去像類bb的對象。在C#中,同樣的規則也適用於訪問修飾符。
a.cs
public class zzz
{
public static void Main()
{
yyy a = new yyy();
}
}
class yyy
{
public int i;
public bool j;
public yyy()
{
System.Console.WriteLine(i);
System.Console.WriteLine(j);
}
}
a.il
.assembly mukhi {}
.class public 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 yyy extends [mscorlib]System.Object
{
.fIEld public int32 i
.fIEld public bool j
.method public hidebysig specialname rtspecialname instance void .ctor() il managed
{
ldarg.0
call instance void [mscorlib] System.Object::.ctor()
ldarg.0
ldfld int32 yyy::i
call void [mscorlib]System.Console::WriteLine(int32)
ldarg.0
ldfld bool yyy::j
call void [mscorlib]System.Console::WriteLine(bool)
ret
}
}
Output
0
False