Gestione di Classi in C# con Property ed Indexer

Nella programmazione ad oggetti, normalmente si tende a dichiarare le variabili d’istanza di tipo private o protected, perché altrimenti sarebbe difficile vedere dove all’interno del programma si è modificato il valore di qualche variabile public. Per evitare questi problemi è buona norma dichiarare la variabile di tipo non pubblico e poi gestire il suo valore tramite due funzioni pubbliche, una per leggere il valore e l’altra per assegnare il valore.

using System;

namespace BaseApp
{
    class Impiegato
    {
        private string m_strNome;

        public void SetNome(string strNome)
        {
            m_strNome = strNome;
        }

        public string GetNome()
        {
            return m_strNome;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Impiegato imp = new Impiegato();
            imp.SetNome("Giampaolo Rossi");
            Console.WriteLine("Ciao " + imp.GetNome());
            Console.ReadKey();
        }
    }
}

Da questo esempio si nota che occorre creare un codice abbastanza prolisso e criptico, il C# per semplificare questa tecnica ha introdotto il concetto di property. All’interno di una qualsiasi classe C# è possibile definire una variabile d’istanza ed associarle dei metodi di get e di set che saranno poi gestiti automaticamente dal compilatore. Vediamo quindi come l’esempio precedente può essere scritto utilizzando le property.

using System;

namespace BaseApp
{
    class Impiegato
    {
        private string m_strNome;

        public string Nome
        {
            get { return m_strNome; }
            set { m_strNome = value; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Impiegato imp = new Impiegato();
            imp.Nome = "Giampaolo Rossi";
            Console.WriteLine("Ciao " + imp.Nome);
            Console.ReadKey();
        }
    }
}

Si può notare immediatamente quanto sia più pulito questo codice rispetto al precedente.
Un’altra caratteristica interessante delle classi del C# è quella di poter definire degli indexer che permettono di trattare un certo oggetto come se fosse un vettore di oggetti. L’implementazione è molto semplice: occorre definire un metodo dal nome this, in grado di ricevere un parametro che rappresenta la posizione ennesima alla quale si intende accedere.

using System;
using System.Collections;

namespace BaseApp
{
    class Impiegati
    {
        private ArrayList arr;

        public Impiegati()
        {
            arr = new ArrayList();
        }

        public void AddImpiegato(string strNome)
        {
            arr.Add(strNome);
        }

        public object this[int nImpiegato]
        {
            set { arr[nImpiegato] = value; }
            get { return arr[nImpiegato]; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Impiegati imp = new Impiegati();
            imp.AddImpiegato("Giampaolo Rossi");
            imp.AddImpiegato("Mario Verdi");
            imp.AddImpiegato("Luciano Bianchi");

            Console.WriteLine("Primo impiegato: " + imp[0]);
            Console.WriteLine("Secondo impiegato: " + imp[1]);
            Console.WriteLine("Terzo impiegato: " + imp[2]);

            Console.ReadKey();
        }
    }
}

In questo esempio abbiamo creato un ArrayList di elementi ed abbiamo definito un indexer di accesso, in questo modo l’ArrayList rimane all’interno della classe ed un programma esterno non può modificarlo perché privato.
L’utilizzo di property ed indexer permette di scrivere codice in linguaggio C# più pulito e controllato rispetto all’esposizione diretta delle variabili d’istanza delle classi.

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.