2012-03-26 11 views
5

Todos los ejemplos de código siempre utilizan base() de la siguiente¿Llamar explícitamente a base() en constructores derivados es opcional?

class A 
{ 
    public A() 
    { 
     Console.Writeline("A"); 
    } 
} 

class B : A 
{ 
    public B():base() {} 
} 

por ejemplo http://msdn.microsoft.com/en-us/library/hfw7t1ce%28v=vs.71%29.aspx

mientras que como he descubierto recientemente

class A 
{ 
    public A() 
    { 
     Console.Writeline("A"); 
    } 
} 

class B : A 
{ 
    public B() {} 
} 

imprime también una

Q - ¿Es una nueva "característica" o es de mala educación no llamar a la base() en constructores de clase derivados y voluntad agregar a mi mal karma y causar problemas después?

o

lata llamando base() de forma segura ser ignorado?

+2

El enlace proporcionado es para Visual Studio 2003 (por lo que no es nuevo) e incluye instrucciones sobre cuándo llamar al constructor base. Cualquier respuesta aquí solo va a repetir información en MSDN. – cadrell0

+0

@ cadrell0 el enlace tiene un ejemplo de base de llamada() de derived.Constructor(), no responde la Q anterior AFAIK – Kumar

Respuesta

7

No, eso no es nuevo: si no llama explícitamente a un constructor base, se llamará al constructor predeterminado de manera predeterminada.

Agregando esto usted mismo lo consideraría simplemente "ruido", el compilador ya lo hará por usted para que no tenga que hacerlo. Solo debe llamar a un constructor base si necesita una sobrecarga específica que no sea el constructor predeterminado (eso significa que necesita tener una llamada de constructor base aunque la clase base no proporcione un constructor predeterminado).

+2

Para obtener más información sobre lo que significa "se llamará al constructor predeterminado", consulte http: // ideone.com/o26u1 (Nota: llamar a 'new B (" b2 ")' llama a 'B :: B (String)' y luego 'A :: A()' constructor). Sin embargo, 'C :: C (String)' llama al constructor 'A :: A (String)' debido a la referencia 'base (arg)'. –

6

Sólo tiene que usar base si

1) Es necesario para pasar variables hasta el constructor base.

2) Debe especificar qué constructor base usar.

Aparte de eso, puede dejarlo sin peligro. Se llamará al constructor base predeterminado.

3

Se llamará al constructor predeterminado ya sea que lo llame explícitamente o no con : base(). Es una cuestión de estilo, pero la convención predominante es dejarlo apagado a menos que llame a un constructor base parametrizado específico.

+0

+1 Bien dicho. (las otras respuestas también son buenas) – radbyx

1

llamando a base() no es necesario. Los constructores base predeterminados se llaman automáticamente a menos que llame explícitamente a otro. Creo que es una cuestión de preferencia personal, algo así como anteponer this antes de acceder a los campos de instancia.

0

No necesita llamar a base() desde su constructor cuando tanto el padre como el hijo tienen un constructor sin parámetros implícito o explícito. Eso sucederá de manera predeterminada, y no, no es nuevo. Normalmente, usaría el método base() para decir qué constructor padre está llamando y para pasar argumentos del constructor del hijo al del padre.

Pruébalo con argumentos en tu constructor para ver cómo funciona.

Cuestiones relacionadas