Se llamará al constructor encadenado inmediatamente antes del cuerpo del constructor de definición. La secuencia IL generada es un call
inmediato al otro constructor, seguido por el IL generado a partir de las declaraciones en el constructor.
Así que si encadena a otro constructor y ese constructor llama al InitializeComponent()
, el constructor que llama no debe llamar a este método.
Por ejemplo, dada esta clase de muestra:
class Foo {
public int A, B;
public Foo() : this(1) {
B = 2;
}
public Foo(int a) {
A = a;
}
}
Ésta es la IL generada:
.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
Tenga en cuenta que el constructor sin argumentos llama a otro constructor antes de asignar 2 al campo B .
@ madmik3: es seguro escribir código para ver qué pasa. La pregunta es si eso está * garantizado * en todas las circunstancias (SO diferente, diferentes versiones del CLR). –
Una publicación relacionada - [orden de ejecución del constructor C#] (https://stackoverflow.com/q/1882692/465053). – RBT