1316 Stimmen

Aufruf eines Konstruktors aus einem anderen

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

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

    public Sample(int theInt) => _intField = theInt;
    public int IntProperty    => _intField;

    private readonly int _intField;
}

Der eine Konstruktor empfängt die Werte direkt, der andere führt eine Berechnung durch, ermittelt die Werte und setzt dann die Felder.

Und jetzt kommt der Haken:

  1. Ich möchte nicht die Code einstellen. In diesem Fall wird nur ein Feld gesetzt, aber es kann natürlich auch mehr als eines sein.
  2. Um die Felder schreibgeschützt zu machen, benötige ich muss ich sie im Konstruktor setzen, also kann ich den gemeinsamen Code nicht in eine eine Utility-Funktion.
  3. Ich weiß nicht, wie man einen anruft Konstruktor von einem anderen aufrufen kann.

Irgendwelche Ideen?

2070voto

SLaks Punkte 832502

Zum Beispiel so:

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

204voto

supercat Punkte 72939

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 tun wollen, oder ihn in ein try-finally verpacken wollen, oder was auch immer), können Sie beliebige oder alle Konstruktoren die schreibgeschützten Variablen per Referenz an eine Initialisierungsroutine übergeben lassen, die dann in der Lage ist, sie nach Belieben zu manipulieren.

public class Sample
{
    private readonly int _intField;
    public int IntProperty => _intField; 

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

78voto

Sudantha Punkte 14804

Vor dem Körper des Konstruktors, verwenden Sie entweder:

: base (parameters)

: this (parameters)

Exemple :

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

15voto

Faisal Mq Punkte 4208

Ich verbessere die Antwort von supercat. Ich denke, das Folgende kann auch gemacht 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);
    }
}

10voto

pasx Punkte 2222

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

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X