Frage Rufen Sie einen Konstruktor von einem anderen auf


Ich habe zwei Konstruktoren, die Werte in schreibgeschützte Felder einspeisen.

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;

}

Ein Konstruktor empfängt die Werte direkt und der andere berechnet und erhält die Werte und setzt die Felder.

Jetzt ist hier der Haken:

  1. Ich möchte das nicht duplizieren Einstellcode. In diesem Fall nur eine Das Feld ist festgelegt, aber natürlich kann es sein Gut, mehr als einer.
  2. Um die Felder nur lesbar zu machen, brauche ich um sie vom Konstruktor aus zu setzen Ich kann den geteilten Code nicht "extrahieren" eine Dienstprogrammfunktion.
  3. Ich weiß nicht, wie ich jemanden anrufen soll Konstruktor von einem anderen.

Irgendwelche Ideen?


759
2017-10-24 16:06


Ursprung


Antworten:


So was:

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

1284
2017-10-24 16:09



Wenn das, was Sie wollen, nicht zufriedenstellend erreicht werden kann, ohne die Initialisierung in einer eigenen Methode zu haben (z. B. weil Sie zu viel vor dem Initialisierungscode machen wollen oder es in eine try-finally oder was auch immer einfügen), können Sie beliebig viele haben Konstruktoren übergeben die schreibgeschützten Variablen durch Bezugnahme auf eine Initialisierungsroutine, die sie dann nach Belieben manipulieren kann.

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



Verwenden Sie vor dem Body des Konstruktors entweder:

: base (parameters)

: this (parameters)

Beispiel:

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

48
2017-10-24 16:12



Ich verbessere die Antwort von Supercat. Ich denke, das Folgende kann auch getan werden:

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



Hier ist ein Beispiel, das einen anderen Konstruktor aufruft und dann die Eigenschaft überprüft, die es gesetzt hat.

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

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

6
2018-05-23 00:17



Ja, du kannst andere Methoden vor der Anrufbasis anrufen oder das!

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



Wenn Sie eine Klasse von einer Basisklasse erben, können Sie den Basisklassenkonstruktor durch Instanziieren der abgeleiteten Klasse aufrufen

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

Ausgabe des Beispielprogramm ist

50 10 20


Sie können auch verwenden this Schlüsselwort, um einen Konstruktor von einem anderen Konstruktor aufzurufen

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

Die Ausgabe von diesem Beispielprogramm ist

20


1
2018-03-31 03:52