Generics sì, generics no

di Cristian Civera, in .NET 2.0,

Premetto che non ho letto e trovato niente a riguardo e che non l'ho scritto io il CLR (non si era capito :-D).

Pian piano comincio a prendere la mano con i Generics. Se si pensa che sono normali tipi o metodi ma con un placeHolder per il tipo la cosa sembra semplice, ma cominciate a domandarvi come si comportano i membri statici? come si fa l'overload e l'hide? come si istanzia un placeHolder? Diventa già più insolito come ragionamento.

Detto questo mi domando: quando usare i Generics? Il Jitter crea per ogni tipo di valore una copia della classe e la specializza, mentre per i tipi di riferimento usa un'unica classe poiché il tipo non è fondamentale, i riferimenti sono infatti pointer di 32 bit ad una zona del Managed Heap.
Se mi serve una collezione ho 3 strade:

  • Utilizzare classi generiche tipo un ArrayList (o classi simili);
  • Creare una collezione apposita che lavora sul mio tipo;
  • Utilizzare una collezione che fa uso dei Generics (es: List) istanziandola col mio tipo.

Dall'osservazione di prima deduco che l'uso dei generics sia sicuramente migliore rispetto alla prima soluzione. Non dobbiamo fare casting, controllo sui tipi e né boxing/unboxing e credo che il lavoro per prepare la classe alla prima istanza sia trascurabile.
Ovvio che l'uso di una collezione apposita è la migliore, ma ci occupa più tempo. Viceversa è inutile creare una collezione che fa uso dei Generics per poi sfruttarla con un solo tipo. Un approccio può essere quello misto: creo una collezione custom che fa uso sottostante di un List in modo da poter risparmiare codice per il dimensionamento dell'array e per fornire l'enumerazione.

Spesso dò un'occhiata al Framework per vedere come lavorano i programmatori Microsoft. Se non lo sanno loro il miglior modo di fare... anche se non sempre è così. La collezione System.Web.UI.ControlCollection è rimasta invariata. In effetti lavora specificamente su Control, non aveva senso riscriverla e quindi neanche usare un List sottostante. Certo è che implementa solo IEnumerable e non anche IEnumerable e quindi l'iterazione con essa (foreach ..) effettua sempre un cast per ogni elemento che facciamo scorrere.

Sicuramente il tempo ci consentirà di perfezionarne nel loro uso ;-)

UPDATE: Daniele mi corregge sempre...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese