जंजीर कन्स्ट्रक्टर को परिभाषित कन्स्ट्रक्टर के शरीर से तुरंत पहले बुलाया जाएगा। उत्पन्न आईएल अनुक्रम अन्य निर्माता के लिए तत्काल call
है, इसके बाद आईएल द्वारा कन्स्ट्रक्टर में बयान से उत्पन्न किया गया है।
तो यदि आप किसी अन्य निर्माता को चेन करते हैं और उस कन्स्ट्रक्टर InitializeComponent()
पर कॉल करता है तो कॉलिंग कन्स्ट्रक्टर को इस विधि को कॉल नहीं करना चाहिए।
उदाहरण के लिए
, इस नमूने वर्ग दिया: कि कोई आर्ग निर्माता बी क्षेत्र के लिए 2 असाइन करने से पहले अन्य निर्माता कॉल
.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
नोट:
class Foo {
public int A, B;
public Foo() : this(1) {
B = 2;
}
public Foo(int a) {
A = a;
}
}
यह उत्पन्न आईएल है ।
@ madmik3: यह सुनिश्चित करने के लिए कोड लिखना आसान है कि क्या होता है। सवाल यह है कि क्या सभी परिस्थितियों में होने वाली * गारंटी * है (अलग-अलग ओएस, सीएलआर के विभिन्न संस्करण)। –
एक संबंधित पोस्ट - [सी # कन्स्ट्रक्टर निष्पादन आदेश] (https://stackoverflow.com/q/1882692/465053)। – RBT