"Genericamente" parlando...

Tutti coloro che hanno partecipato al workshop UGIdotNET del 17 Settembre (quello "Agile", per intenderci) sanno che Pierre ha realizzato un valido add-in per Visual Studio .NET che automatizza la creazione di collezioni fortemente tipizzate. Dico "valido" perchè permette davvero di risparmiare un sacco di tempo (lo uso anche io, in tutta sincerità). Ebbene, in un suo post, Pierre dichiara che Whidbey renderà inutile questo add-in, e motiva la sua affermzaione presentando la struttura di base della definizione di una Lista tipizzata mediante l'uso dei generics. Esagera? Può risultare interessante, a questo proposito, mostrare come i generics permettano di implementare contenitori generici in grado di essere tipizzati a runtime, evitando quindi i "soliti" box/unbox (nel caso di value type) e in ogni caso risparmiando un sacco di tempo. Ledisendgentlemen, ecco a voi uno Stack "generico" confrontato con la sua implementazione "vanilla" possibile con il compilatore C# attuale:

Stack generico "attuale" Stack generico "Whidbey Edition"

class Stack
{
    private object[] store;
    private int size=0;

    public Stack()
    {
        store=new object[10];
    }
   
    public void Push(object x)
    {
        if (size>=store.Size)
        {
            object[] tmp = new object[size*2];
            Array.Copy(store,tmp,size);
            store = tmp;
         }
         store[size++] = x;
     }

     public object Pop()
    {
        return store[--size];
    }
}

class Stack<T>
{
    private T[] store;
    private int size=0;
   
    public Stack()
    {
        store=new T[10];
    }

    public void Push(T x)
    {
        if (size>=store.Size) 
        {
            T[] tmp = new T[size*2];
            Array.Copy(store,tmp,size);
            store = tmp;
        }
        store[size++] = x;
    }

    public T Pop()
    {
        return store[--size];
    }
}

Diamo ora una occhiata al codice necessario ad usare le due definizioni di Stack proposte:

class FakeMain
{
    public static void Main()
    {
        Stack x = new Stack();
        x.Push(101);
        Console.WriteLine((int) x.Pop() == 101);
    }
}
class FakeMain
{
    public static void Main()
    {
        Stack<int> x = new Stack<int>();
        x.Push(101);
        Console.WriteLine(x.Pop() == 101);
    }
}

A me piace... E a voi? Pensate che Pierre abbia ragione, allora? As usual, ai poster(i) l'ardua sentenza...

«novembre»
domlunmarmergiovensab
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456