2012-03-26 12 views
5

Tutti gli esempi di codice utilizzare sempre base() come segueChiama in modo esplicito base() nei costruttori derivati ​​facoltativi?

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

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

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

mentre come ho scoperto di recente

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

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

stampa anche una

Q - si tratta di una nuova "feature" o è di cattivo gusto di non chiamare di base() in costruttori di classi derivate e volontà aggiungi al mio cattivo karma e causa problemi in seguito?

o

può chiamare di base() in modo sicuro essere ignorato?

+2

il collegamento fornito è per Visual Studio 2003 (quindi non è nuovo) e include istruzioni su quando chiamare il costruttore di base. Qualsiasi risposta qui sta per essere la ripetizione delle informazioni nel MSDN. – cadrell0

+0

@ cadrell0 il collegamento ha un esempio di chiamata base() da derived.Constructor(), non risponde alla Q sopra AFAIK – Kumar

risposta

7

No, non è nuovo: se non si chiama esplicitamente un costruttore di base, il costruttore predefinito verrà chiamato per impostazione predefinita.

Aggiungendo questo tu stesso considererei solo "rumore", il compilatore lo farà già per te in modo da non doverlo fare. Dovresti chiamare un costruttore di basi solo se hai bisogno di un sovraccarico specifico diverso dal costruttore predefinito (ciò significa che devi avere una chiamata al costruttore di base anche se la classe base non fornisce un costruttore predefinito).

+2

Per elaborare su cosa si intende per "il costruttore predefinito verrà chiamato", vedere http: // ideone.com/o26u1 (Nota chiamando 'new B (" b2 ")' chiama 'B :: B (String)' quindi 'A :: A()' costruttore.) Tuttavia, 'C :: C (String)' chiama il costruttore 'A :: A (String)' a causa del riferimento 'base (arg)'. –

6

Hai solo bisogno di usare base se

1) È necessario passare variabili fino al costruttore di base.

2) È necessario specificare quale costruttore di base utilizzare.

Diverso da quello che si può tranquillamente lasciare fuori. Il costruttore base predefinito verrà chiamato.

3

Il costruttore predefinito verrà chiamato anche se non lo si chiama esplicitamente con : base(). È una questione di stile, ma la convenzione prevalente è di lasciarla a meno che tu non stia chiamando un costruttore di base specifico, parametrizzato.

+0

+1 Ben detto. (anche le altre risposte sono buone) – radbyx

1

chiamata base() non richiesta. I costruttori di base predefiniti vengono chiamati automaticamente, a meno che non si chiami esplicitamente un altro. Penso che sia una questione di preferenze personali, un po 'come anteporre this prima di accedere ai campi di istanza.

0

Non è necessario chiamare base() dal costruttore quando sia il genitore che il figlio hanno un costruttore di parametri senza implicito o esplicito. Questo succederà di default e no, non è nuovo. In genere, si usa il metodo base() per dire quale costruttore genitore si sta chiamando e per passare argomenti dal costruttore del figlio a quello del genitore.

Provalo con argomenti nel tuo costruttore per vedere come funziona.

Problemi correlati