2009-05-06 5 views

risposta

192

Append :this(required params) alla fine del costruttore di fare 'costruttore chaining'

public Test(bool a, int b, string c) 
    : this(a, b) 
{ 
    this.m_C = c; 
} 
public Test(bool a, int b, float d) 
    : this(a, b) 
{ 
    this.m_D = d; 
} 
private Test(bool a, int b) 
{ 
    this.m_A = a; 
    this.m_B = b; 
} 

Fonte Per gentile concessione di csharp411.com

+0

Questo è stato abbastanza facile .. grazie! –

27

Sì, si utilizza la seguente

public class Lens 
{ 
    public Lens(string parameter1) 
    { 
     //blabla 
    } 

    public Lens(string parameter1, string parameter2) : this(parameter1) 
    { 

    } 
} 
+0

Penso che quello che succederebbe nel secondo costruttore è che dovresti creare un'istanza locale di Lens che esce dall'ambito alla fine del costruttore e NON è assegnata a "questo". È necessario utilizzare la sintassi del concatenamento del costruttore nel post di Gishu per ottenere ciò che la domanda richiede. –

+0

Sì, mi dispiace per quello. Corretto ora –

9

L'ordine di valutazione del costruttore deve anche essere preso in considerazione quando si concatenano i costruttori:

Per prendere in prestito dalla risposta di Gishu, un po '(per mantenere il codice in qualche modo simile):

public Test(bool a, int b, string c) 
    : this(a, b) 
{ 
    this.C = c; 
} 

private Test(bool a, int b) 
{ 
    this.A = a; 
    this.B = b; 
} 

Se cambiamo l'evalution eseguita nel costruttore private, un po', vedremo perché costruttore ordinamento è importante:

private Test(bool a, int b) 
{ 
    // ... remember that this is called by the public constructor 
    // with `this(...` 

    if (hasValue(this.C)) 
    { 
     // ... 
    } 

    this.A = a; 
    this.B = b; 
} 

Sopra, ho aggiunto una chiamata di funzione fasulla che determina se la proprietà C ha un valore. A prima vista, potrebbe sembrare che C abbia un valore - è impostato nel costruttore chiamante; tuttavia, è importante ricordare che i costruttori sono funzioni.

this(a, b) viene chiamato - e deve "restituire" - prima che venga eseguito il corpo del costruttore public. Detto in modo diverso, l'ultimo costruttore chiamato è il primo costruttore valutato. In questo caso, private viene valutato prima dello public (solo per utilizzare la visibilità come identificatore).