Vantaggi e limitazioni di generics
Aggiornamento: novembre 2007
La funzionalità generics, che consente di specificare i tipi su cui agisce una classe o un metodo generico, delega al compilatore l'attività di verifica dell'indipendenza dai tipi. Non è più necessario scrivere codice che consenta di verificare la correttezza del tipo di dati in quanto la verifica viene eseguita in fase di compilazione. L'esigenza di cast di tipo e la possibilità di errori di runtime vengono quindi ridotte.
I generics offrono l'indipendenza dai tipi senza richiedere implementazioni multiple. È ad esempio possibile creare un elenco collegato di stringhe con la seguente dichiarazione di variabile:
Dim llist As New LinkedList(Of String)
LinkedList<string> llist = new LinkedList<string>();
LinkedList<String^>^ llist = gcnew LinkedList<String^>();
Non è necessario ereditare da un tipo base ed eseguire l'override dei membri. L'elenco collegato è pronto per un utilizzo immediato. Per i tipi di insiemi generici forniti da .NET Framework, vedere System.Collections.Generic e System.Collections.ObjectModel.
Oltre che per l'indipendenza dai tipi, i tipi di insiemi generici sono in genere particolarmente indicati per l'archiviazione e la modifica dei tipi di valore, poiché eliminano la necessità di eseguirne il boxing.
I delegati generici consentono di attivare callback indipendenti dai tipi senza dover creare più classi delegate. Il delegato generico Predicate<T>, ad esempio, consente di creare un metodo che implementa i criteri di ricerca personalizzati per un determinato tipo e di utilizzare tale metodo insieme a metodi del tipo Array quali Find<T>, FindLast<T> e FindAll<T>.
I delegati generici possono essere utilizzati anche nel codice generato dinamicamente, senza richiedere la creazione di un tipo delegato. In tal modo aumentano le possibilità di utilizzo di metodi dinamici semplici in alternativa alla generazione di interi assembly. Per ulteriori informazioni, vedere Procedura: definire ed eseguire metodi dinamici e DynamicMethod.
In molti casi i compilatori Visual Basic, Visual C++ e C# sono in grado di determinare in base al contesto i tipi utilizzati da una chiamata a un metodo generico, semplificando notevolmente la sintassi per l'utilizzo dei metodi generici. Nel codice seguente, ad esempio, sono riportati il formato lungo e quello breve per la chiamata a un metodo generico BinarySearch che consente di eseguire una ricerca in una matrice di stringhe. Nel formato breve i compilatori deducono il parametro di tipo corretto dai tipi di argomenti del metodo.
Dim index As Integer = Array.BinarySearch(myArray, "test string")
Dim index As Integer = _
Array.BinarySearch(Of String)(myArray, "test string")
int index = Array.BinarySearch(myArray, "test string");
int index = Array.BinarySearch<string>(myArray, "test string");
int index = Array::BinarySearch(myArray, "test string");
int index = Array::BinarySearch<String^>(myArray, "test string");
Limitazioni relative ai generics
Di seguito sono indicate le limitazioni relative ai generics in .NET Framework versione 2.0:
È possibile derivare tipi generici dalla maggior parte delle classi base, ad esempio MarshalByRefObject, nonché utilizzare vincoli per imporre la derivazione di parametri di tipi generici da classi base quali MarshalByRefObject. Questa versione di .NET Framework non supporta tuttavia tipi generici associati al contesto. È possibile derivare un tipo generico da ContextBoundObject, ma il tentativo di creazione di un'istanza di questo tipo determina la generazione di un'eccezione TypeLoadException.
Le enumerazioni non possono avere parametri di tipi generici. Un'enumerazione può essere generica solo incidentalmente, ad esempio se è nidificata in un tipo generico definito mediante Visual Basic, C# o C++. Per ulteriori informazioni, vedere Enumerazioni nel sistema di tipi comuni.
I metodi dinamici lightweight non possono essere generici. Per ulteriori informazioni sui metodi dinamici, vedere Scenari relativi a metodi dinamici della reflection emit.
In Visual Basic, C# e C++ è possibile creare un'istanza di un tipo nidificato in un tipo generico solo se ai tipi sono stati assegnati i parametri di tipo relativi a tutti i tipi di inclusione. Ciò significa che nella reflection un tipo nidificato definito mediante uno di questi linguaggi contiene i parametri di tipo relativi a tutti i tipi di inclusione. In questo modo è possibile utilizzare i parametri di tipo dei tipi di inclusione nelle definizioni di membro di un tipo nidificato. Per ulteriori informazioni, vedere la sezione "Tipi nidificati" in MakeGenericType.
Nota: Non è necessario che un tipo nidificato definito mediante la creazione di codice in un assembly dinamico, o tramite lo strumento Assembler MSIL (Ilasm.exe), includa i parametri di tipo dei relativi tipi di inclusione. Se tuttavia non include i parametri di tipo, questi non risulteranno nell'ambito della classe nidificata.
Per ulteriori informazioni, vedere la sezione "Tipi nidificati" in MakeGenericType.
Vedere anche
Concetti
Cenni preliminari sui generics in .NET Framework
Insiemi generici in .NET Framework
Delegati generici per la modifica di matrici ed elenchi
Riferimenti
System.Collections.ObjectModel