wake-up-neo.com

Aufruf eines Konstruktors aus einem anderen Konstruktor derselben Klasse

Ich habe eine Klasse mit 2 Konstruktoren:

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

    public Lens(string parameter1, string parameter2)
    {
       // want to call constructor with 1 param here..
    }
}

Ich möchte den ersten Konstruktor ab dem zweiten aufrufen. Ist das in C # möglich?

134
Robbert Dam

Hänge :this(required params) an das Ende des Konstruktors an, um 'Konstruktorkettung' zu machen

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

213
Gishu

Ja, Sie würden Folgendes verwenden

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

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

    }
}
31
Matthew Dresser

Die Reihenfolge der Konstruktorbewertung muss auch berücksichtigt werden, wenn Konstruktoren verkettet werden:

Aus Gishus Antwort etwas ausborgen (um den Code etwas ähnlich zu halten):

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 Konstruktor private durchgeführte Auswertung geringfügig ändern, werden wir feststellen, warum die Reihenfolge der Konstruktoren wichtig ist:

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

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

this(a, b) wird aufgerufen und muss "return" sein, bevor der Body des public -Konstruktors ausgeführt wird. Anders ausgedrückt, der letzte aufgerufene Konstruktor ist der erste ausgewertete Konstruktor. In diesem Fall wird private vor public ausgewertet (nur um die Sichtbarkeit als Kennung zu verwenden).

13
Thomas