domenica 3 gennaio 2016

Typedef in C#

In C# non esiste lo statement typedef, ciò nonostante è possibile usare l'istruzione using per definire il proprio tipo personalizzato.
Nel seguente esempio si è definito un tipo ereditato da una Dictionary in cui la chiave è costituita da una tupla di 3 stringhe e il valore da una dictionary di stinghe:
 
using TYPE_STRINGSDICTIONARY_KEY3 = Dictionary<Tuple<string, string, string>, Dictionary<string, string>>;


A questo punto si può definire, ad esempio, una variabile rows del tipo definito sopra:

private TYPE_STRINGSDICTIONARY_KEY3 rows = new TYPE_STRINGSDICTIONARY_KEY3();


Si può notare la semplicità e la leggibiltà del codice.

Trovo l'utilizzo del tipo dato importante per semplificare ulteriormente la definizione dei metodi di classe, invece di definire un parametro come:

void Method(Dictionary<Tuple<string, string, string>, Dictionary<string, string>> param) {
...
}

avremmo una definizione molto più leggibile:

void Method(TYPE_STRINGSDICTIONARY_KEY3  param) {
...
}
La soluzione proposta precedentemente non permette di avere una definizione di tipo raggiungibile dagli altri moduli del progetto.
Per ovviare si può utilizzare una classe, nell'esempio seguente viene definito un nuovo tipo "TYPE_EVENTARGS_PARAMETERS" che rappresenta una Dictionary<string, object>.

Questo nuovo tipo può essere utilizzato, ad esempio, per passare un elenco di parametri a dei metodi di una classe:

public class TYPE_EVENTARGS_PARAMETERS : Dictionary
{
        #region Constructor
        public TYPE_EVENTARGS_PARAMETERS()
            : base()
        { }

        public TYPE_EVENTARGS_PARAMETERS(Dictionary value)
            : base(value)
        { }
        #endregion
}

Utilizzo:
public TYPE_EVENTARGS_PARAMETERS Parameters { get; set; }

this.Parameters = new TYPE_EVENTARGS_PARAMETERS();

private void Load(TYPE_EVENTARGS_PARAMETERS parameters)
{
                object value;
                if (parameters != null && parameters.TryGetValue("ID", out value))
                    int id = (int)value;

}