Połączony konstruktor zostanie wywołany bezpośrednio przed treścią definiującego konstruktora. Wygenerowana sekwencja IL jest natychmiastowa call
dla innego konstruktora, po której następuje IL wygenerowana z instrukcji w konstruktorze.
Jeśli więc łańcuch do innego konstruktora i ten konstruktor wywołuje InitializeComponent()
, konstruktor wywołujący nie powinien wywoływać tej metody.
Na przykład, biorąc pod uwagę tej klasy próbki:
class Foo {
public int A, B;
public Foo() : this(1) {
B = 2;
}
public Foo(int a) {
A = a;
}
}
To jest generowany IL:
.class private auto ansi beforefieldinit Foo
extends [mscorlib]System.Object
{
.field public int32 A
.field public int32 B
// method line 1
.method public hidebysig specialname rtspecialname
instance default void '.ctor'() cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldc.i4.1
IL_0002: call instance void class Foo::'.ctor'(int32)
IL_0007: ldarg.0
IL_0008: ldc.i4.2
IL_0009: stfld int32 Foo::B
IL_000e: ret
} // end of method Foo::.ctor
// method line 2
.method public hidebysig specialname rtspecialname
instance default void '.ctor' (int32 a) cil managed
{
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void object::'.ctor'()
IL_0006: ldarg.0
IL_0007: ldarg.1
IL_0008: stfld int32 Foo::A
IL_000d: ret
} // end of method Foo::.ctor
} // end of class Foo
Zauważ, że nie-Arg konstruktor wywołuje inne konstruktora przed przypisaniem 2 do pola B .
@ madmik3: na pewno łatwo jest napisać kod, aby zobaczyć, co się stanie. Pytanie brzmi, czy jest to * gwarantowane *, że stanie się to we wszystkich okolicznościach (różne systemy operacyjne, różne wersje CLR). –
Pokrewny wpis - [C# wykonanie zlecenia konstruktora] (https://stackoverflow.com/q/1882692/465053). – RBT