2010-09-06 10 views
5

Supongamos que inicializar los miembros de una clase como esta:En C#, ¿se genera un constructor predeterminado cuando se inicializan los miembros de la clase?

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

¿El compilador genera un constructor por defecto en esta situación?

En general, sé que un constructor puede inicializar el valor de las variables de instancia de clase y también puede realizar algunas otras operaciones de inicialización apropiadas para la clase. Pero en el ejemplo anterior, he inicializado el valor de i y j fuera de un constructor. En esta situación, ¿el compilador aún genera un constructor predeterminado? Si es así, ¿qué hace el constructor predeterminado?

+0

He editado significativamente su pregunta para aclarar lo que creo que está tratando de hacer y potencialmente darle más atención. Si he calculado mal tu intención, revierte mi edición o edita más. – DavidRR

Respuesta

11

El compilador aún genera un constructor predeterminado en este caso. El constructor maneja la inicialización de i y j. Si miras a IL, esto es 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

anotado para el OP; Espero que esté bien –

+0

Gracias Marc. Buena idea. –

0

primero se ejecutará la inicialización de la variable que tenga. Entonces todo lo que tenga en su constructor se ejecutará después.

3

Puede leer estas cosas en el official ECMA language standard. El Capítulo 17.4.5 habla sobre este tema específico, básicamente indicando que los campos serán inicializados por defecto con cualquier valor predeterminado que tenga el tipo (0 o 0.0, respectivamente en su caso), y luego la inicialización del valor se ejecutará en el orden en que se declaran en el archivo fuente.

+0

+1 para referirse a la especificación estándar – jgauffin

Cuestiones relacionadas