domingo, 6 de septiembre de 2009

Mejorando el rendimiento en nuestros constructores de clase

Cuanto más leo CLR Via C# más me gusta el libro, una de las cosas que me ha llamado la atención es la manera de declarar los diferentes constructores que pueda tener una clase. Por ejemplo, supongamos que tenemos una clase "X", con "n" campos a inicializar, y en esa clase definimos "X" constructores diferentes, ejemplo:

    internal sealed class MenosRendimiento

    {

        private int _a = 1;

        private string _cadena = "Hola";

        private double _n = 5.125;

        private byte _b;



        public MenosRendimiento() { }

        public MenosRendimiento(int a) { }

        public MenosRendimiento(string cadena) { }

        public MenosRendimiento(int a, string cadena) { }

    }



De esta forma estamos incurriendo en un gasto de recursos innecesarios, ya que estaremos inicializando los tres campos de la clase en cada constructor (en este caso 12 veces). _b nos garantiza que se inicializa a cero aunque no lo especifiquemos.

Lo correcto sería declarar los campos de clase sin inicializar, crear un constructor simple que inicialice los campos, y los demás constructores llamarán al constructor de inicialización común, para verlo más claro os pongo como quedaría el código:

    internal sealed class MasRendimiento

    {

        private int _a;

        private string _cadena;

        private double _n;

        private byte _b;



        //Este constructor inicializa los campos

        //a su valor por defecto.

        //todos los demás constructores llamarán

        //explícitamente a este constructor

        public MasRendimiento()

        {

            _a = 1;

            _cadena = "Hola";

            _n = 5.125;

            _b = 0xff;

        }

        //Campos a valor por defecto y luego

        //cambia a

        public MasRendimiento(int a) : this()

        {

            _a = a;

        }

        //Campos a valor por defecto y luego

        //cambia cadena

        public MasRendimiento(string cadena) : this()

        {

            _cadena = cadena;

        }

        //Campos a valor por defecto y luego

        //cambia a y cadena

        public MasRendimiento(int a, string cadena)

            : this()

        {

            _a = a;

            _cadena = cadena;

        }

    }



Esta es la "magia" que nos aporta C#, que mediante "this" podamos llamar de un constructor a otro.

No hay comentarios: