J'ai un cours avec 2 constructeurs:
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2)
{
// want to call constructor with 1 param here..
}
}
Je veux appeler le premier constructeur du deuxième. Est-ce possible en C #?
Ajoutez :this(required params)
à la fin du constructeur pour faire 'chaînage du constructeur'
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;
}
Source: csharp411.com
Oui, vous utiliseriez ce qui suit
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2) : this(parameter1)
{
}
}
L'ordre d'évaluation des constructeurs doit également être pris en compte lors du chaînage des constructeurs:
Pour reprendre la réponse de Gishu, un peu (pour garder le code un peu similaire):
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;
}
Si nous modifions légèrement l'évaluation effectuée dans le constructeur private
, nous verrons pourquoi le classement des constructeurs est important:
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;
}
Ci-dessus, j'ai ajouté un appel de fonction factice qui détermine si la propriété C
a une valeur. À première vue, il pourrait sembler que C
aurait une valeur - elle est définie dans le constructeur appelant; Cependant, il est important de rappeler que les constructeurs sont des fonctions.
this(a, b)
est appelé - et doit "retourner" - avant que le corps du constructeur public
ne soit exécuté. Autrement dit, le dernier constructeur appelé est le premier constructeur évalué. Dans ce cas, private
est évalué avant public
(juste pour utiliser la visibilité comme identifiant).