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?
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
Ja, Sie würden Folgendes verwenden
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2) : this(parameter1)
{
}
}
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).