2010-09-06 12 views
5

Supponiamo che io inizializzare membri di una classe come questa:In C#, è un costruttore predefinito generato quando i membri della classe vengono inizializzati?

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

fa il compilatore a generare un costruttore di default in questa situazione?

In generale, so che un costruttore può inizializzare il valore delle variabili di istanza di classe e può anche eseguire alcune altre operazioni di inizializzazione appropriate per la classe. Ma nell'esempio sopra, ho inizializzato il valore di i e j al di fuori di un costruttore. In questa situazione, il compilatore genera ancora un costruttore predefinito? In tal caso, cosa fa il costruttore predefinito?

+0

Ho modificato in modo significativo la tua domanda per chiarire cosa penso che stai cercando di chiedere e potenzialmente portare più attenzione ad esso. Se ho valutato male il tuo intento, ti preghiamo di ripristinare la mia modifica o modificare ulteriormente. – DavidRR

risposta

11

In questo caso, il compilatore genera ancora un costruttore predefinito. Il costruttore gestisce l'inizializzazione di i e j. Se si guarda all'IL questo è evidente.

.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

Annotato per l'OP; Spero che sia OK –

+0

Grazie Marc. Buona idea. –

0

l'inizializzazione della variabile in precedenza verrà eseguita per prima. Quindi tutto ciò che hai nel tuo costruttore verrà eseguito dopo.

3

È possibile leggere queste informazioni nello official ECMA language standard. Il capitolo 17.4.5 parla di questo problema specifico, affermando fondamentalmente che i campi saranno inizializzati di default con qualsiasi valore predefinito del tipo (0 o 0.0, rispettivamente nel tuo caso), e successivamente l'inizializzazione del valore sarà eseguita nell'ordine in cui sono dichiarati nel file sorgente.

+0

+1 per il riferimento alle specifiche standard – jgauffin

Problemi correlati