I Generics del C# 2.0: quando sono preferibili alternative diverse?

Mi accodo ai precedenti blog sul tema:


Quando sono preferibili... alternative diverse?

 

  • Algoritmi generici
    Poco supportata e molto difficoltosa  la scrittura e l'utilizzo di algoritmi generici a causa delle limitazione dei generics del C#2.0(1).
    Per la realizzazione di algoritmi generici è più pratico ed efficace utilizzare la programmazione generativa, vedi il tool
    CodeSmith.
    Per questo nel Framework ad esempio è stato necessario ridefinire in diverse collezioni generiche il metodo ForEach e Find invece di fornire un algoritmo generico.
  • Tipi generici
    • class e struct generiche
      Poco supportata e molto difficoltosa  la scrittura e l'utilizzo di class e struct generiche(2) a causa delle limitazioni sui membri generici non supportati dei generics del C#2.0 (vedi i membri generici qui di seguito).
      Per la realizzazione di class e struct generiche è più pratico ed efficace utilizzare la programmazione generativa, vedi il tool
      CodeSmith.
    • attributi generici
      Non supportati, in alternativa utilizzare la programmazione generativa, vedi il tool CodeSmith.
  • Membri generici
    •  Non supportato l'operatore di conversione: rende impossibile stabilire relazioni tra tipi diversi usati come parametri di un tipo generico(3). 
    •  Non supportati(4): operatore, events, array, property, indexer, constructor, destructor e web methods (Web Services)
  • Politiche di comportamento generiche
    Non sono supportate perché i parametri di un tipo generico possono essere solo tipi e non valori. Per questo ad esempio il tipo
    Dictionary accetta la politica di ordinamento (IComparer) come parametro nel costruttore e non come parametro del tipo generico.
    Specificare la politica di comportamento generale nel costruttore o se indispensabile utilizzare la programmazione generativa, vedi il tool CodeSmith.

Tags :   |

__________

(1) Nel codice gli unici membri di un type parameter a cui è possibile accedere sono quelli definiti da System.Object e quelli indicati nei constraint dalla eventuale classe base e dalle eventuali interfaccie  per il  type parameter del tipo o del metodo generico. Questa limitazione e le sue conseguenze sono state consapevolmente accettate da MS che si ripropone di superarle in future evoluzioni dei Generics.
(2) Un esempio ne è il tipo System.Nullable il cui utilizzo è scomodo al punto da essere impraticabile, infatti per renderlo utilizzabile è stato necessario estestendere il compilatore del C# per implementare ciò non era supportato dai Generics.
(3) Quindi rende impossibile definire una conversione da System.Nullable a System.Nullable (definita invece a livello di compilatore) o definire una relazione di ereditarietè per poter passare come argomento una List dove è atteso un List anche se Impiegato deriva da Dipendente.
(4) Non sono supportati come membri generici ma possono comunque fare riferimento ai parametri del tipo generico che li contiene. 

Aggiornato il 10-Marzo alle 00:22

Print | posted @ Wednesday, March 9, 2005 1:32 AM

Comments have been closed on this topic.