Bel de ene constructor van de andere

Ik heb twee constructors die waarden invoeren in alleen-lezen velden.

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

De ene constructor ontvangt de waarden rechtstreeks, en de andere doet wat berekeningen en verkrijgt de waarden, en stelt vervolgens de velden in.

Dit is het addertje onder het gras:

  1. Ik wil de . niet dupliceren
    instelcode. In dit geval slechts één
    veld is ingesteld, maar dat kan natuurlijk
    wel meer dan één zijn.
  2. Om de velden alleen-lezen te maken, heb ik nodig
    om ze vanuit de constructor in te stellen, dus
    Ik kan de gedeelde code niet “uitpakken” om
    een hulpprogramma-functie.
  3. Ik weet niet hoe ik er een moet bellen
    constructor van een andere.

Enig idee?


Antwoord 1, autoriteit 100%

Zoals dit:

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

Antwoord 2, autoriteit 10%

Als wat je wilt niet naar tevredenheid kan worden bereikt zonder de initialisatie op zijn eigen methode (bijvoorbeeld omdat je te veel wilt doen vóór de initialisatiecode, of het in een try-finale wilt stoppen, of wat dan ook), kun je een of alle constructeurs geven de alleen-lezen variabelen door aan een initialisatieroutine, die ze vervolgens naar believen kan manipuleren.

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

Antwoord 3, autoriteit 4%

Gebruik vóór de hoofdtekst van de constructor:

: base (parameters)
: this (parameters)

Voorbeeld:

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

Antwoord 4

Ik verbeter het antwoord van supercat. Ik denk dat het volgende ook kan:

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

Antwoord 5

Hier is een voorbeeld dat een andere constructor aanroept en vervolgens de eigenschap controleert die het heeft ingesteld.

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

Other episodes