2010-01-07 16 views
13

Duplicar posibles:
C# constructor execution orderC# base) orden constructor (

class Foo 
{ 
    public int abc; 
    Foo() 
    { 
     abc = 3; 
    } 

} 

class Bar : Foo 
{ 
    Bar() : base() 
    { 
     abc = 2; 
    } 
} 

En el ejemplo anterior, cuando se crea un objeto de Bar, cuál será el valor de BarObject.abc ? ¿Se llama primero al constructor base o se ejecuta Bar(),/then/the base() constructor?

+2

Mala práctica para que las variables miembro se hagan públicas. Es posible que desee recoger un buen libro sobre los objetos iniciales de C#. – JonH

+3

Duplicado de http://stackoverflow.com/questions/1882692/c-constructor-execution-order, con una excelente respuesta aceptada y comentarios que vinculan las entradas del blog de Eric Lippert nada menos. –

Respuesta

28

Será 2. Los constructores se ejecutan en orden desde la clase base hasta la última clase heredada.

Tenga en cuenta que los inicializadores (variables estáticas y de instancia) se ejecutan en la dirección opuesta.

La secuencia completa está aquí: http://www.csharp411.com/c-object-initialization/ Constuctor

+0

Es bueno saber que los inicializadores están en el orden opuesto. Pero, ¿por qué está diseñado de esta manera, para tener 2 órdenes diferentes? – RayLuo

+1

@RayLuo Explicado en un comentario de la respuesta duplicada. Se vincula a una página cuya "Parte 2" es [aquí] (https://blogs.msdn.microsoft.com/ericlippert/2008/02/18/why-do-initializers-run-in-the-opposite-order -as-constructors-part-two /) y dice: "" si los constructores y los inicializadores se ejecutan en su orden real, entonces se garantiza que un campo de tipo de referencia readonido inicializado sea no nulo en cualquier llamada posible. Esa garantía no se puede cumplir si los inicializadores se ejecutan en el orden esperado. " – Quantic

1

La variable abc se configurará como 3 y luego se cambiará a 2 (se llama primero al constructor base).

+0

Errr, abc es público – alastairs

+1

No fue cuando primero publicó la pregunta. Lo he eliminado para acomodar su actualización. – kemiller2002

+0

alastairs no era público cuando lo publicó. – JonH

4

Se llama al primer constructor de la clase base seguido del constructor de la clase derivada. El resultado es 2. Debería indicar explícitamente la accesibilidad de esa variable de clase. ¿Está protegido, privado o público?

veo la ha cambiado a pública ahora, por lo que habrá 2.

Este enlace le ayudará a entender más constructores, cómo se utilizan, cuando se les llama, y ​​el orden de llamada al constructor cuando se utiliza herencia:

http://www.yoda.arachsys.com/csharp/constructors.html

también es posible que desee probar en realidad este usted mismo, usted aprenderá más por la práctica de la escritura de código y luego simplemente leerlo.

Intenta declarar Bar y dar salida a su valor. Utilice algunas propiedades:

class Foo 
    { 
     public int abc; 
     public Foo() 
     { 
      abc = 3; 
     } 

     public int ABC 
     { 
      get { return abc; } 
      set { abc = value; } 
     } 

    } 

    class Bar : Foo 
    { 
     public Bar() : base() 
     { 
      abc = 2; 
     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      Bar b = new Bar(); 
      Console.WriteLine(b.ABC); 
      Console.ReadLine(); 

     } 
    } 

Una impresión simple daría el resultado que está buscando. Aquí está la salida:

alt text http://img141.imageshack.us/img141/9238/rrrrr.jpg

no te encanta mi namespace :-). Por cierto, también podría usar propiedades automáticas para que la propiedad sea simplemente pública int ABC {get; set;}.

1

El constructor base será called first, pero este código no compila. Los campos privados no son accesibles desde subclases. Por lo menos, un campo debe ser protected para ser utilizado en una subclase.

Pero incluso sabiendo esto, el comportamiento que está intentando es confuso porque es sorprendente. El solo hecho de que haya tenido que preguntar a qué orden van las cosas implica que se arruinará cuando se olvide el pedido.

1

La base se llama primero, y que tendría un valor de 2 para abc

2

Suponiendo que hagas abc protegida para que esta compila, será 2 ; sin embargo, se llama primero base().

Para cosas como esta, escriba una aplicación de prueba simple y configure algunos puntos de interrupción para encontrar la respuesta.

+0

+1 para sugerir redacción de pruebas simples – ChrisF

Cuestiones relacionadas