2013-02-13 14 views
8

non riesco a capire la differenza tra un semplice nudoQuando e perché dovrei usare ClassName: questo (null)?

Public ClassName() {} 

e

Public ClassName() : this(null) {} 

So che posso usarlo solo se ho un ctor +1 sovraccarico, ma non riesco a capire il vantaggi di defining the parameterless constructor in questo modo.

+1

Vedere: [Concatenamento costruttore C#] (http://stackoverflow.com/q/1814953/) –

+0

Pulisce leggermente l'API e riduce la duplicazione del codice riutilizzando il costruttore implicito a parametro singolo. – JosephHirn

risposta

10

Ciò consente al costruttore single-param di avere tutta la logica, quindi non viene ripetuta.

public ClassName() : this(null) {} 

public ClassName(string s) 
{ 
    // logic (code) 
    if (s != null) { 
     // more logic 
    } 
    // Even more logic 
} 

Spero che sia chiaro che la "logica" e "ancora di più la logica" avrebbero avuto bisogno di essere ripetuto nel costruttore senza parametri se non per il this(null).

+0

Grazie per la risposta. Cosa intendi con "avere tutta la logica" esattamente? – Sergio

+1

@Daedalus Dite che dovete fare del lavoro di installazione nel costruttore che non dipende affatto dal parametro. Invece di copiare e incollare il codice due volte, puoi semplicemente fare in modo che il costruttore paramtetrless chiami il 2 ° costruttore e metti il ​​lavoro di setup una volta lì. –

+1

@Daedalus Piuttosto che ripetere il codice in entrambi i costruttori con una modifica minore dell'esistenza di un parametro, si inserisce tutto il codice in un costruttore e l'altro chiama quello con tutto il codice e alcuni valori predefiniti. – Servy

3

Un caso molto utile è situazioni come WinForms in cui il progettista richiede un costruttore prameterless ma si desidera che il modulo richieda un costruttore.

public partial SomeForm : Form 
{ 
    private SomeForm() : this(null) 
    { 
    } 

    public SomeForm(SomeClass initData) 
    { 
     InitializeComponent(); 

     //Do some work here that does not rely on initData.   

     if(initData != null) 
     { 
      //do somtehing with initData, this section would be skipped over by the winforms designer. 
     } 
    } 
} 
+0

Ok ma se ometto questo (nulla) non cambia nulla, ai miei occhi ... Cosa mi manca? – Sergio

+0

@Daedalus Niente, questo non è un buon esempio. – Servy

+2

No, se ometti 'this (null)' il designer non chiamerà mai 'InitializeComponent()' –

1

Esiste uno schema denominato Iniezione del costruttore. Questo schema è utile soprattutto per testare le unità e condividere la logica. Ecco un esempio

public class SomeClass 
{ 
    private ISomeInterface _someInterface; 
    public SomeClass() : this (null){} //here mostly we pass concrete implementation 
    //of the interface like this(new SomeImplementation()) 

    public SomeClass(ISomeInterface someInterface) 
    { 
     _someInterface = someInterface;  
     //Do other logics here 
    } 
} 

Come vedete qui, i test di unità saranno facili passando l'implementazione falsa. Inoltre, la logica è condivisa (DRY). E fai tutta la logica all'interno del costruttore che prende il maggior numero di parametri

Ma nel tuo caso, passa null, quindi è un contesto basato. Devo sapere qual è il tuo contesto.

+0

Iniezione costruttore viene utilizzato con Iniezione di dipendenza. La domanda e la tua risposta riguardano entrambi Constructor Chaining. –

Problemi correlati