Question Appelez un constructeur d'un autre


J'ai deux constructeurs qui fournissent des valeurs aux 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 les valeurs directement et l'autre effectue un calcul et obtient les valeurs, puis définit les champs.

Maintenant, voici la capture:

  1. Je ne veux pas dupliquer code de réglage. Dans ce cas, un seul le champ est défini mais bien sûr il peut Soit plus d'un.
  2. Pour rendre les champs lisibles, j'ai besoin pour les mettre du constructeur, donc Je ne peux pas "extraire" le code partagé une fonction d'utilité.
  3. Je ne sais pas comment appeler un constructeur d'un autre.

Des idées?


759
2017-10-24 16:06


origine


Réponses:


Comme ça:

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

1284
2017-10-24 16:09



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

131
2017-07-22 20:52



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

48
2017-10-24 16:12



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

8
2017-11-28 13:07



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

6
2018-05-23 00:17



Oui, vous pouvez appeler une autre méthode avant la base d'appel ou celle-ci!

public class MyException : Exception
{
    public MyException(int number) : base(ConvertToString(number)) 
    {
    }

    private static string ConvertToString(int number) 
    { 
      return number.toString()
    }

}

4
2018-06-07 20:42



Lorsque vous héritez d'une classe d'une classe de base, vous pouvez appeler le constructeur de la classe de base en instanciant la classe dérivée

class sample
{
    public int x;

    public sample(int value)
    {
        x = value;
    }
}

class der : sample
{
    public int a;
    public int b;

    public der(int value1,int value2) : base(50)
    {
        a = value1;
        b = value2;
    }
}

class run 
{
    public static void Main(string[] args)
    {
        der obj = new der(10,20);

        System.Console.WriteLine(obj.x);
        System.Console.WriteLine(obj.a);
        System.Console.WriteLine(obj.b);
    }
}

Sortie de exemple de programme est

50 10 20


Vous pouvez aussi utiliser this mot-clé pour appeler un constructeur d'un autre constructeur

class sample
{
    public int x;

    public sample(int value) 
    {
        x = value;
    }

    public sample(sample obj) : this(obj.x) 
    {
    }
}

class run
{
    public static void Main(string[] args) 
    {
        sample s = new sample(20);
        sample ss = new sample(s);

        System.Console.WriteLine(ss.x);
    }
}

La sortie de cette exemple de programme est

20


1
2018-03-31 03:52