Condividi tramite


Cenni preliminari sui generics in .NET Framework

Aggiornamento: novembre 2007

In questo argomento è riportata una panoramica sui generics di .NET Framework nonché un riepilogo dei tipi o metodi generici. Viene inoltre definita la terminologia utilizzata per descrivere i generics.

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 Generic 
{
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.

Dim g As New Generic(Of String)
g.Field = "A string"
Generic<string> g = new Generic<string>();
g.Field = "A string";
Generic<String^>^ g = gcnew Generic<String^>();
g->Field = "A string";

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 Dictionary<TKey, TValue>, ad esempio, può contenere due tipi: chiavi e valori. Dal momento che si tratta solo di 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 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.

  • 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 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
        ...
    End Function
    
    T Generic<T>(T arg) { T temp = arg; ...}
    
    generic<typename T> T Generic(T arg) { T temp = arg; ...};
    

    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
            ...
        End Function
    End Class
    Class Generic(Of T)
        Function M(ByVal arg As T) As T
            ...
        End Function
    End Class
    
    class A 
    {
        T G<T>(T arg) {...}
    }
    class Generic<T> 
    {
        T M(T arg) {...}
    }
    
    ref class A 
    {
        generic<T> T G(T arg) {...};
    };
    generic<typename T> ref class Generic 
    {
        T M(T arg) {...};
    };
    

Visual C++, C# e Visual Basic forniscono il supporto completo per la definizione e l'utilizzo dei generics. Per ulteriori informazioni, vedere Tipi generici in Visual Basic, Introduzione ai generics (Guida per programmatori C#) e Overview of Generics in Visual C++.

Generics e tipi nidificati

Un tipo nidificato in un tipo generico può dipendere dai parametri di tipo del tipo generico di inclusione. Common Language Runtime considera i tipi nidificati come generici, anche se non dispongono di parametri di tipo generici specifici. Quando si crea un'istanza di un tipo nidificato, è necessario specificare gli argomenti di tipo per tutti i tipi generici di inclusione.

Vedere anche

Attività

Procedura: definire un tipo generico con la reflection emit

Concetti

Quando utilizzare insiemi generici

Tipi generici in Visual Basic

Overview of Generics in Visual C++

Insiemi generici in .NET Framework

Delegati generici per la modifica di matrici ed elenchi

Interfacce generiche

Vantaggi e limitazioni di generics

Riferimenti

System.Collections.Generic

System.Collections.ObjectModel

Introduzione ai generics (Guida per programmatori C#)

Altre risorse

Tipi di insieme comunemente utilizzati

Reflection e tipi generici

Generics in .NET Framework