Condividi tramite


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:

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

Insiemi generici in .NET Framework

Vengono descritti le classi Collection generiche e altri tipi generici in .NET Framework.

Delegati generici per la modifica di matrici ed elenchi

Vengono descritti i delegati generici per conversioni, predicati di ricerca e azioni da eseguire sugli elementi di una matrice o di un insieme.

Interfacce generiche

Vengono descritte le interfacce generiche che forniscono funzionalità comuni a famiglie di tipi generici.

Covarianza e controvarianza nei generics

Vengono descritte la covarianza e la controvarianza nei parametri di tipo generico.

Vantaggi e limitazioni di generics

Vengono riepilogati i vantaggi e le restrizioni nell'utilizzo di generics.

Tipi di insieme comunemente utilizzati

Vengono fornite informazioni di riepilogo sulle caratteristiche e sugli scenari di utilizzo dei tipi di insieme presenti in .NET Framework, inclusi i tipi generici.

Quando utilizzare insiemi 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.

Generic Types in Visual Basic

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.

Introduzione ai generics (Guida per programmatori C#)

Viene fornita una panoramica sulla definizione e sull'utilizzo dei tipi generici per gli utenti C#.

Overview of Generics in Visual C++

Viene descritta la funzionalità generics per gli utenti C++, incluse le differenze tra generics e modelli.

Torna all'inizio

Riferimenti

System.Collections.Generic

System.Collections.ObjectModel

System.Reflection.Emit.OpCodes

Torna all'inizio