2012-01-04 19 views
9

Voglio chiamare il costruttore all'interno della classe come: public class Myclass() {Come chiamare il costruttore all'interno della classe?

public MyClass(){ 
     //...... 
    } 

    public MyClass(int id):this(){ 
     //...... 
    } 

    private void Reset(){ 
     //..... 
     this = new MyClass(id); //here I want to call constructor 
     //...... 
    } 
} 

ma non funziona. È possibile e come posso farlo se sì?

+2

Perché vuoi farlo? Non è possibile modificare il puntatore 'this' in questo modo all'interno di un metodo di istanza, né se lo si desidera. –

risposta

10

Non è possibile. Ma quello che potresti fare è dividere la logica del costruttore in un metodo di inizializzazione che poi potrebbe resettare.

public MyClass(){ 
    //...... 
    } 

    public MyClass(int id):this(){ 
     Initialize(id); 
    } 

    private void Initialize(int id){ 
    //.... 
    } 

    private void Reset(){ 
     //..... 
     Initialize(id); 
     //...... 
    } 
} 
3

No, questo non è possibile. Non puoi assegnarlo a questo.

Si potrebbe tuttavia lasciare Reset() restituire una nuova istanza di MyClass modo che il codice chiamante potrebbe dire:

public class MyClass 
{ 
    public MyClass Reset() 
    { 
     return new MyClass(); 
    } 
} 

MyClass c = new MyClass(); 
c = c.Reset(); 

Oppure si potrebbe implementare il metodo Reset in modo tale che tutti i campi sono reinizializzati ai valori predefiniti.

+0

Mi piace l'idea di Reset() che restituisce una nuova istanza, in questo caso probabilmente dovrebbe essere 'statico'. –

+2

Se è stata restituita una nuova istanza, non è più possibile reimpostare nulla. Restituisce un'istanza appena creata della classe. Tipo di fuorviante. –

+0

Vero, forse 'Create()' sarebbe un nome di metodo migliore. –

14

Risposta semplice: non è possibile.

Un po 'più complicato risposta: Spostare la logica di inizializzazione in un metodo separato che può essere chiamato dal costruttore e il metodo di Reset():

public class MyClass 
{ 
    public int? Id { get; } 

    public MyClass() 
    { 
     Initialize(); 
    } 

    public MyClass(int id) 
    { 
     Initialize(id); 
    } 

    public Reset() 
    { 
     Initialize(); 
    } 

    private Initialize(int? id = null) 
    { 
     // initialize values here instead of the constructor 
     Id = id; 
    } 
} 
+1

Questo è perfettamente succinto e chiaro e ha aiutato immensamente la mia comprensione. – secretwep

2

È possibile chiamata un costruttore per la classe all'interno della vostra classe (in realtà questo è spesso fatto con metodi di fabbrica):

public class MyClass 
{ 
    public static MyClass Create() 
    { 
     return new MyClass(); 
    } 
} 

Ma non è possibile modificare il valore del riferimento this all'interno della classe. Dovresti invece avere il tuo metodo "Reset()" per riportare i campi ai loro valori predefiniti.

1

All'interno di una classe non è possibile riassegnare this (anche se vale la pena notare che all'interno di una struttura è perfettamente legale). La domanda, tuttavia, è se si . Suppongo che il tuo obiettivo sia quello di impostare tutti i valori dei campi su uno stato specifico, così come altre persone hanno già detto che puoi avere il tuo metodo Reset restituire una nuova istanza o puoi scomporre la logica in un metodo Clear() e chiamarla anziché.

Problemi correlati