1276 votes

appeler un constructeur d'un autre

J'ai deux constructeurs, qui se nourrissent des valeurs de champs en lecture seule.

class Sample
{
    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);

        _intField = i;
    }

    public Sample(int theInt)
    {
        _intField = theInt;
    }


    public int IntProperty
    {
        get { return _intField; }
    }
    private readonly int _intField;

}

Un constructeur reçoit directement les valeurs, l'autre fait un peu de calcul et obtient les valeurs, puis définit les champs.

Maintenant, voici la capture:

  1. Je ne veux pas reproduire le réglage de code. Dans ce cas, juste une le terrain est fixé, mais il peut bien sûr y bien avoir plus d'un.
  2. Pour rendre les champs en lecture seule, j'ai besoin de pour les définir à partir du constructeur, donc Je ne peux pas "extrait de" le code partagé à une fonction d'utilité.
  3. Je ne sais pas comment appeler un constructeur à partir d'un autre.

Des idées?

2016voto

SLaks Points 391154

Comme ça:

 public Sample(string str) : this(int.Parse(str)) {
}
 

198voto

supercat Points 25534

Si ce que vous voulez ne peut pas être atteint de manière satisfaisante sans avoir l'initialisation dans sa propre méthode (par exemple, parce que vous voulez en faire trop avant le code d'initialisation, ou envelopper dans un essai, enfin), vous pouvez en avoir les constructeurs transmettent les variables en lecture seule par référence à une routine d'initialisation, qui pourra alors les manipuler à volonté.

 class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        intField = newValue;
    }

    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);
        setupStuff(ref _intField,i);
    }

    public Sample(int theInt)
    {
        setupStuff(ref _intField, theInt);
    }
}
 

74voto

Sudantha Points 2907

avant le corps du constructeur, utilisez:

 : base (parameters)

: this (parameters)
 

Exemple :-

 public class People: User
{
   public People (int EmpID) : base (EmpID)
   {
      //Add more statements here.
   }
}
 

14voto

Faisal Mq Points 188

J'améliore la réponse de supercat. Je suppose que ce qui suit peut également être fait:

 class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        //Do some stuff here based upon the necessary initialized variables.
        intField = newValue;
    }

    public Sample(string theIntAsString, bool? doStuff = true)
    {
        //Initialization of some necessary variables.
        //==========================================
        int i = int.Parse(theIntAsString);
        // ................
        // .......................
        //==========================================

        if (!doStuff.HasValue || doStuff.Value == true)
           setupStuff(ref _intField,i);
    }

    public Sample(int theInt): this(theInt, false) //"false" param to avoid setupStuff() being called two times
    {
        setupStuff(ref _intField, theInt);
    }
}
 

9voto

pasx Points 141

Voici un exemple qui appelle un autre constructeur, puis vérifie la propriété qu'il a définie.

     public SomeClass(int i)
    {
        I = i;
    }

    public SomeClass(SomeOtherClass soc)
        : this(soc.J)
    {
        if (I==0)
        {
            I = DoSomethingHere();
        }
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X