c# summary example - Llama a un constructor de otro.





4 Answers

Si lo que desea no se puede lograr satisfactoriamente sin tener la inicialización en su propio método (por ejemplo, porque quiere hacer mucho antes del código de inicialización, o envuélvalo en un intento-finalmente, o lo que sea) puede tener cualquiera o todo los constructores pasan las variables de solo lectura por referencia a una rutina de inicialización, que luego podrá manipularlas a voluntad.

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);
    }
}
generate documentation xml

Tengo dos constructores que alimentan valores a los campos de solo lectura.

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 constructor recibe los valores directamente, y el otro realiza algún cálculo y obtiene los valores, luego establece los campos.

Ahora aquí está la trampa:

  1. No quiero duplicar el código de configuración. En este caso, solo se establece un campo pero, por supuesto, puede haber más de uno.
  2. Para que los campos sean de solo lectura, debo establecerlos desde el constructor, por lo que no puedo "extraer" el código compartido a una función de utilidad.
  3. No sé cómo llamar a un constructor de otro.

¿Algunas ideas?




Estoy mejorando la respuesta de Supercat. Supongo que también se puede hacer lo siguiente:

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



Sí, puedes llamar a otro método antes de la base de llamadas o esto!

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

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

}



El encadenamiento del constructor, es decir, puede usar "Base" para Es una relación y "Este" puede usar para la misma clase, cuando desee llamar a varios Constructores en una sola llamada.

  class BaseClass
{
    public BaseClass():this(10)
    {
    }
    public BaseClass(int val)
    {
    }
}
    class Program
    {
        static void Main(string[] args)
        {
            new BaseClass();
            ReadLine();
        }
    }





Related