Generics in .NET Framework
I generics consentono di personalizzare un metodo, una classe, una struttura o un'interfaccia in base al tipo di dati preciso al quale l'oggetto dovrà essere applicato. Ad esempio, anziché utilizzare la classe Hashtable, che consente chiavi e valori di qualsiasi tipo, è possibile utilizzare la classe generica Dictionary<TKey, TValue> e specificare il tipo consentito per la chiave e quello consentito per il valore. Tra i vantaggi offerti dai generics sono inclusi un livello più elevato di riusabilità del codice e una maggiore indipendenza dai tipi.
In questo argomento è riportata una panoramica sui generics di .NET Framework nonché un riepilogo dei tipi o metodi generici. Include le sezioni seguenti:
Definizione e utilizzo dei generics
Terminologia associata ai generics
Libreria di classi e supporto del linguaggio
Generics e tipi annidati
Argomenti correlati
Riferimenti
Definizione e utilizzo dei generics
Il termine generics viene utilizzato per indicare classi, strutture, interfacce e metodi dotati di segnaposto (parametri di tipo) per uno o più tipi contenuti o utilizzati in tali elementi. Una classe di insiemi generici può utilizzare un parametro di tipo come segnaposto per il tipo di oggetti in essa contenuti. I parametri di tipo appaiono come tipi dei campi e come tipi di parametri dei metodi della classe. Un metodo generico può utilizzare il relativo parametro di tipo come tipo del valore restituito o di uno dei relativi parametri formali. Nel codice riportato di seguito è illustrata une definizione semplice di classe generica.
Public Class Generic(Of T)
Public Field As T
End Class
public class Generic<T>
{
public T Field;
}
generic<typename T>
public ref class Generics
{
public:
T Field;
};
Quando si crea un'istanza di una classe generica, si specificano i tipi effettivi che sostituiranno i parametri di tipo. In tal modo viene stabilita una nuova classe generica, definita come classe generica costruita, in cui ogni occorrenza dei parametri di tipo è sostituita dai tipi prescelti. Il risultato è una classe indipendente dai tipi personalizzata in base ai tipi specificati, come illustrato nel codice riportato di seguito.
Public Shared Sub Main()
Dim g As New Generic(Of String)
g.Field = "A string"
'...
Console.WriteLine("Generic.Field = ""{0}""", g.Field)
Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName)
End Sub
public static void Main()
{
Generic<string> g = new Generic<string>();
g.Field = "A string";
//...
Console.WriteLine("Generic.Field = \"{0}\"", g.Field);
Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}
static void Main()
{
Generics<String^>^ g = gcnew Generics<String^>();
g->Field = "A string";
//...
Console::WriteLine("Generics.Field = \"{0}\"", g->Field);
Console::WriteLine("Generics.Field.GetType() = {0}", g->Field->GetType()->FullName);
}
Torna all'inizio
Terminologia associata ai generics
Negli argomenti relativi ai generics nella documentazione di .NET Framework vengono utilizzati i termini seguenti:
Una definizione di tipo generico è una dichiarazione di classe, struttura o interfaccia che funge da modello, con segnaposto per i tipi che può contenere o utilizzare. La classe System.Collections.Generic.Dictionary<TKey, TValue>, ad esempio, può contenere due tipi: chiavi e valori. Poiché una definizione di tipo generico è solo un modello, non è possibile creare istanze di una classe, struttura o interfaccia che sia una definizione di tipo generico.
I parametri di tipo generico, o parametri di tipo, sono i segnaposto presenti in un tipo generico o in una definizione di metodo. Il tipo generico System.Collections.Generic.Dictionary<TKey, TValue> dispone di due parametri, TKey e TValue, che rappresentano i tipi dei relativi valori e chiavi.
Un tipo generico costruito, o tipo costruito, è il risultato della specifica di tipi per i parametri di tipo generico di una definizione di tipo generico.
Un argomento di tipo generico è qualsiasi tipo utilizzato in sostituzione di un parametro di tipo generico.
Il termine generale tipo generico include sia tipi costruiti sia definizioni di tipo generico.
La covarianza e la controvarianza di parametri di tipo generico consentono di utilizzare tipi generici costruiti i cui argomenti di tipo sono più derivati (covarianza) o meno derivati (controvarianza) rispetto a un tipo costruito di destinazione. La covarianza e la controvarianza sono definite collettivamente varianza. Per ulteriori informazioni, vedere Covarianza e controvarianza nei generics.
I vincoli sono limiti imposti su parametri di tipo generico. È ad esempio possibile limitare un parametro di tipo ai tipi che implementano l'interfaccia generica System.Collections.Generic.IComparer<T> per garantire la possibilità di ordinare le istanze del tipo. È inoltre possibile vincolare i parametri di tipo a tipi che hanno una determinata classe base, hanno un costruttore predefinito oppure sono tipi di riferimento o tipi di valore. Gli utenti del tipo generico non possono utilizzare in sostituzione argomenti di tipo che non soddisfano i vincoli.
Una definizione di metodo generico è un metodo con due elenchi di parametri, ossia uno di parametri di tipo generico e uno di parametri formali. I parametri di tipo possono apparire come tipo restituito o come tipi dei parametri formali, come illustrato nel codice riportato di seguito.
Function Generic(Of T)(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
T Generic<T>(T arg)
{
T temp = arg;
//...
return temp;
}
generic<typename T>
T Generic(T arg)
{
T temp = arg;
//...
return temp;
}
I metodi generici possono apparire sui tipi generici o non generici. È importante notare che un metodo non può essere considerato generico semplicemente perché appartiene a un tipo generico o perché dispone di parametri formali i cui tipi sono i parametri generici del tipo di inclusione. Per essere generico, un metodo deve disporre di uno specifico elenco di parametri di tipo. Nel codice riportato di seguito, solo il metodo G è generico.
Class A
Function G(Of T)(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
End Class
Class Generic(Of T)
Function M(ByVal arg As T) As T
Dim temp As T = arg
'...
Return temp
End Function
End Class
class A
{
T G<T>(T arg)
{
T temp = arg;
//...
return temp;
}
}
class Generic<T>
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
}
ref class A
{
generic<typename T>
T G(T arg)
{
T temp = arg;
//...
return temp;
}
};
generic<typename T>
ref class Generic
{
T M(T arg)
{
T temp = arg;
//...
return temp;
}
};
Torna all'inizio
Libreria di classi e supporto del linguaggio
In .NET Framework sono disponibili numerose classi Collection generiche negli spazi dei nomi seguenti:
In System.Collections.Generic è inclusa la maggior parte dei tipi di insieme generici forniti da .NET Framework, ad esempio le classi generiche List<T> e Dictionary<TKey, TValue>.
Nello spazio dei nomi System.Collections.ObjectModel sono inclusi i tipi di insieme generici aggiuntivi, ad esempio la classe generica ReadOnlyCollection<T>, utili per l'esposizione dei modelli a oggetti agli utenti delle classi.
Le interfacce generiche per l'implementazione di confronti di ordinamento e uguaglianza vengono fornite nello spazio dei nomi System, insieme ai tipi di delegati generici per gestori eventi, conversioni e predicati di ricerca.
Il supporto per i generics è stato aggiunto allo spazio dei nomi System.Reflection per l'esame di tipi e metodi generici, a System.Reflection.Emit per la creazione di assembly dinamici che contengono tipi e metodi generici e a System.CodeDom per la creazione di grafici di origine che includono generics.
Common Language Runtime fornisce nuovi codici operativi e prefissi per il supporto di tipi generici in MSIL (Microsoft Intermediate Language), tra cui Stelem, Ldelem, Unbox_Any, Constrained e Readonly.
Visual C++, C# e Visual Basic forniscono supporto completo per la definizione e l'utilizzo di generics. Per ulteriori informazioni sul supporto del linguaggio, vedere Generic Types in Visual Basic, Introduzione ai generics (Guida per programmatori C#) e Overview of Generics in Visual C++.
Torna all'inizio
Generics e tipi annidati
Un tipo annidato in un tipo generico può dipendere dai parametri di tipo del tipo generico di inclusione. Common Language Runtime considera i tipi annidati come generici, anche se non dispongono di parametri di tipo generici specifici. Quando si crea un'istanza di un tipo annidato, è necessario specificare gli argomenti di tipo per tutti i tipi generici di inclusione.
Torna all'inizio
Argomenti correlati
Titolo |
Descrizione |
---|---|
Vengono descritti le classi Collection generiche e altri tipi generici in .NET Framework. |
|
Vengono descritti i delegati generici per conversioni, predicati di ricerca e azioni da eseguire sugli elementi di una matrice o di un insieme. |
|
Vengono descritte le interfacce generiche che forniscono funzionalità comuni a famiglie di tipi generici. |
|
Vengono descritte la covarianza e la controvarianza nei parametri di tipo generico. |
|
Vengono riepilogati i vantaggi e le restrizioni nell'utilizzo di generics. |
|
Vengono fornite informazioni di riepilogo sulle caratteristiche e sugli scenari di utilizzo dei tipi di insieme presenti in .NET Framework, inclusi i tipi generici. |
|
Vengono descritte le regole generali per determinare quando utilizzare i tipi di insiemi generici. |
|
Procedura: definire un tipo generico tramite reflection emit |
Viene illustrato come generare assembly dinamici in cui sono inclusi metodi e tipi generici. |
Viene descritta la funzionalità generics per gli utenti Visual Basic. Sono inclusi gli argomenti relativi alle procedure per l'utilizzo e la definizione dei tipi generici. |
|
Viene fornita una panoramica sulla definizione e sull'utilizzo dei tipi generici per gli utenti C#. |
|
Viene descritta la funzionalità generics per gli utenti C++, incluse le differenze tra generics e modelli. |
Torna all'inizio
Riferimenti
System.Collections.ObjectModel
System.Reflection.Emit.OpCodes
Torna all'inizio