2009-05-06 14 views

Antwort

192

Anfügen :this(required params) am Ende des Konstruktors 'Konstruktorverkettung' Ja

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; 
} 

Quelle mit freundlicher Genehmigung von csharp411.com

+0

Das war ziemlich einfach .. danke! –

27

zu tun, werden Sie die folgenden

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

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

    } 
} 
+0

Ich denke, was im zweiten Konstruktor passieren würde, wäre, dass Sie eine lokale Instanz von Lens erstellen würden, die am Ende des Konstruktors den Gültigkeitsbereich verlässt und NICHT "this" zugewiesen ist. Sie müssen die Konstruktorkettensyntax in Gishus Beitrag verwenden, um zu erreichen, was die Frage verlangt. –

+0

Yup, tut mir leid. Jetzt korrigiert. –

9

verwenden würden, Bei der Verkettung von Konstruktoren muss auch die Reihenfolge der Konstruktorauswertung berücksichtigt werden:

Um von Gishu Antwort zu leihen, ein bisschen (halten Code etwas ähnlich):

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; 
} 

Wenn wir die im private Konstruktor ausgeführt evalution ändern, leicht, werden wir sehen, warum Konstruktor Bestellung wichtig ist:

Oben habe ich einen falschen Funktionsaufruf hinzugefügt, der bestimmt, ob die Eigenschaft C einen Wert hat. Auf den ersten Blick scheint es, dass C einen Wert haben würde - es wird im aufrufenden Konstruktor gesetzt; Es ist jedoch wichtig, daran zu denken, dass Konstruktoren Funktionen sind.

this(a, b) heißt - und muss "zurückgeben" - bevor der public Konstruktor Körper ausgeführt wird. Anders ausgedrückt ist der zuletzt aufgerufene Konstruktor der erste ermittelte Konstruktor. In diesem Fall wird private vor public ausgewertet (nur um die Sichtbarkeit als Bezeichner zu verwenden).

Verwandte Themen