2010-09-06 8 views
5

Angenommen, ich Mitglieder einer Klasse wie folgt initialisieren:In C# wird ein Standardkonstruktor generiert, wenn Klassenmitglieder initialisiert werden?

class A 
{ 
    public int i=4; 
    public double j=6.0; 
} 

Hat der Compiler einen Standardkonstruktor in dieser Situation erzeugen?

Im Allgemeinen weiß ich, dass ein Konstruktor den Wert von Klasseninstanzvariablen initialisieren und auch einige andere für die Klasse geeignete Initialisierungsoperationen durchführen kann. Aber im obigen Beispiel habe ich den Wert i und j außerhalb eines Konstruktors initialisiert. Produziert der Compiler in diesem Fall noch einen Standardkonstruktor? Wenn ja, was macht der Standardkonstruktor?

+0

Ich habe Ihre Frage erheblich bearbeitet, um zu klären, was ich denke, dass Sie versuchen zu fragen und möglicherweise mehr Aufmerksamkeit darauf zu lenken. Wenn ich Ihre Absicht falsch eingeschätzt habe, rolle meine Bearbeitung zurück oder bearbeite sie weiter. – DavidRR

Antwort

11

Der Compiler generiert in diesem Fall immer noch einen Standardkonstruktor. Der Konstruktor behandelt die Initialisierung von i und j. Wenn Sie die IL betrachten, ist dies offensichtlich.

.class auto ansi nested private beforefieldinit A 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
     .maxstack 8 
     L_0000: ldarg.0 // pushes "this" onto the stack 
     L_0001: ldc.i4.4 // pushes 4 (as Int32) onto the stack 
     L_0002: stfld int32 TestApp.Program/A::i // assigns to i (this.i=4) 
     L_0007: ldarg.0 // pushes "this" onto the stack 
     L_0008: ldc.r8 6 // pushes 6 (as Double) onto the stack 
     L_0011: stfld float64 TestApp.Program/A::j // assigns to j (this.j=6.0) 
     L_0016: ldarg.0 // pushes "this" onto the stack 
     L_0017: call instance void [mscorlib]System.Object::.ctor() // calls the base-ctor 
     /* if you had a custom constructor, the body would go here */ 
     L_001c: ret // and back we go 
    } 
+2

Mit dem OP versehen; hoffe das ist OK –

+0

Danke Marc. Gute Idee. –

0

Die oben beschriebene Variableninitialisierung wird zuerst ausgeführt. Dann wird alles, was Sie in Ihrem Konstruktor haben, ausgeführt.

3

Sie können diese Dinge in der official ECMA language standard lesen. Kapitel 17.4.5 spricht über dieses spezielle Problem, das grundsätzlich besagt, dass Felder standardmäßig mit dem Standardwert initialisiert werden, den der Typ hat (in Ihrem Fall 0 bzw. 0.0), und danach wird die Wertinitialisierung in der Reihenfolge ausgeführt, in der sie ausgeführt werden sind in der Quelldatei deklariert.

+0

+1 für die Bezugnahme auf die Standardspezifikation – jgauffin

Verwandte Themen