web-dev-qa-db-fra.com

Appel du constructeur depuis un autre constructeur de la même classe

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 #?

134
Robbert Dam

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

213
Gishu

Oui, vous utiliseriez ce qui suit

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

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

    }
}
31
Matthew Dresser

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).

13
Thomas