"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...

posted @ venerdì 7 novembre 2003 14:06

Print

Comments on this entry:

# Molto interessante

Left by elisa at 03/05/2005 14:36
Gravatar
Grazie del tutorial.

Your comment:



 (will not be displayed)


 
 
Please add 2 and 3 and type the answer here:
 

Live Comment Preview:

 
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011