标题比较要約,所以我写了一デモ来说明问题:
パブリッククラスA
{
パブリック A()
{
Console.WriteLine("Aの構造関数数被调用");
}
}
パブリッククラス B : A
{
プライベート X x = 新しい X(); //初期化器
}
パブリッククラスX
{
パブリック X()
{
Console.WriteLine("Xの構造関数数调用");
}
}
static void Main(string[] args)
{
B b = 新しい B();
}
子クラスの構造関数を使用する前に、ベースタイプの構造関数を使用する予定ですが、最初の化子とベースクラスの構造関数が一番下にありますか?
初期化代コード会が構造関数内の代コードの前に実行されるため、私は次のように解釈します。
パブリッククラス B : A
{
プライベート X x = 新しい X(); //初期化器
}
等より:
パブリッククラス B : A
{
プライベート X x;
パブリックB()
{
x=新しいX();
}
}
したがって、私も同様に認識されているベース型の構造関数は、子クラスの初期化器の前に実行され、上のデモ実行の結果は逆に、次のようになります。
Xの構造関数数用
Aの構造関数が評価される
これは、子クラスの構築器がすでに実行されていることを示しており、生成された構築関数の IL 番号を確認します。
パブリッククラスB:A
{
プライベート X x;
パブリックB()
{
x = 新しい X();
}
}
生成された構造関数の IL 番号は次のとおりです:
.method public Hidebysig 特別名 rtspecialname
インスタンス void .ctor() cil 管理
{
// 代码大小 21 (0x15)
.maxstack 8
IL_0000: ldarg.0
IL_0001: インスタンス void ConsoleApplication1.Program/A::.ctor() を呼び出します
IL_0006: いや
IL_0007: いや
IL_0008: ldarg.0
IL_0009: newobj インスタンス void ConsoleApplication1.Program/X::.ctor()
IL_000e: stfld クラス ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_0013: いや
IL_0014: レット
} // メソッド B::.ctor の終了
事前に使用される基底型の構造関数がコードからわかります。
パブリッククラス B : A
{
プライベート X x = 新しい X();
}
生成された構造関数の IL 番号は次のとおりです:
.method public Hidebysig 特別名 rtspecialname
インスタンス void .ctor() cil 管理
{
// 代码大小 19 (0x13)
.maxstack 8
IL_0000: ldarg.0
IL_0001: newobj インスタンス void ConsoleApplication1.Program/X::.ctor()
IL_0006: stfld クラス ConsoleApplication1.Program/X ConsoleApplication1.Program/B::x
IL_000b: ldarg.0
IL_000c: インスタンス void ConsoleApplication1.Program/A::.ctor() を呼び出します
IL_0011: いや
IL_0012: レット
} // メソッド B::.ctor の終了
最初に初期化器を使用する代コードがあり、その後、基本型構造関数を再度使用することがわかります。初期化器を使用する場合と使用しない場合も領域があり、主な領域は基本型構造関数の使用順序が異なることがわかります。
C# 编译器は何ですか?
请大家多多指教啊!
-