[c#] Chiama un costruttore da un altro


2 Answers

Se quello che vuoi non può essere ottenuto in modo soddisfacente senza l'inizializzazione nel suo metodo (es. Perché vuoi fare troppo prima del codice di inizializzazione, o avvolgerlo in un tentativo-finalmente, o qualsiasi altra cosa) puoi averne uno o tutti i costruttori passano le variabili readonly in riferimento a una routine di inizializzazione, che sarà quindi in grado di manipolarle a 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);
    }
}
Question

Ho due costruttori che alimentano valori in campi di sola lettura.

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 costruttore riceve direttamente i valori e l'altro esegue alcuni calcoli e ottiene i valori, quindi imposta i campi.

Ora ecco il trucco:

  1. Non voglio duplicare il codice di impostazione. In questo caso, è impostato un solo campo, ma ovviamente potrebbero essercene più di uno.
  2. Per rendere i campi in sola lettura, ho bisogno di impostarli dal costruttore, quindi non posso "estrarre" il codice condiviso in una funzione di utilità.
  3. Non so come chiamare un costruttore da un altro.

Qualche idea?




Sì, puoi chiamare un altro metodo prima della base di chiamata o questo!

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

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

}



Sto migliorando la risposta del supercat. Immagino che quanto segue possa anche essere fatto:

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



Related