Generic è una potente tecnica di programmazione in C#.NET che consente di scrivere codice riutilizzabile per diversi tipi di dati senza dover riscrivere la logica per ogni tipo. Generic funziona utilizzando parametri di tipo, rappresentati da lettere maiuscole tra parentesi angolari <>, come ad esempio List<T>
, Dictionary<TKey, TValue>
. Dove T
, TKey
e TValue
sono parametri di tipo che rappresentano il tipo di dati concreto che verrà utilizzato all’istanziazione dell’oggetto.
Una delle applicazioni più comuni di Generic è nella creazione di collezioni (insiemi) come List<T>
. Prima di Generic, per creare un elenco di oggetti Student
, si doveva usare ArrayList
e eseguire il cast di ogni elemento estratto. Questo comportava il rischio di errori di runtime in caso di cast errato.
#
// Senza generic
ArrayList students = new ArrayList();
students.Add(new Student());
students.Add(new Car()); // Nessun errore in fase di compilazione
Student first = (Student)students[0]; // Cast necessario, possibile errore di runtime
Con Generic, List<T>
risolve questo problema consentendo solo l’aggiunta di oggetti di tipo T
all’elenco. Il compilatore rileverà un errore in fase di compilazione se si tenta di aggiungere un oggetto di tipo errato.
#
// Con generic
List<Student> students = new List<Student>();
students.Add(new Student());
students.Add(new Car()); // Errore in fase di compilazione
Student first = students[0]; // Nessun cast necessario
L’uso di Generic offre numerosi vantaggi:
- Riutilizzo del codice: Scrivere il codice una sola volta per più tipi di dati. Ad esempio, la classe
List<T>
può essere utilizzata perList<int>
,List<string>
,List<Student>
,… - Sicurezza dei tipi: Il compilatore verifica i tipi di dati in fase di compilazione, riducendo gli errori di runtime.
- Prestazioni: Evita il boxing/unboxing quando si lavora con tipi di valore, aumentando le prestazioni del programma.
- Leggibilità e manutenibilità: Codice più chiaro, comprensibile e facile da manutenere.
Generic non viene utilizzato solo nelle collezioni, ma anche nella definizione di metodi (Generic Method) e classi (Generic Class). Ad esempio, un metodo Swap<T>
può scambiare il valore di due variabili di qualsiasi tipo di dati.
#
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
int x = 10;
int y = 20;
Swap<int>(ref x, ref y); // Scambia due numeri interi
string str1 = "Hello";
string str2 = "World";
Swap<string>(ref str1, ref str2); // Scambia due stringhe
In sintesi, Generic è una funzionalità importante in C#.NET che aiuta a scrivere codice flessibile, sicuro ed efficiente. È la base per molte altre tecnologie come LINQ e svolge un ruolo chiave nello sviluppo di applicazioni moderne. Comprendere cosa sono gli oggetti generici e come usarli aiuterà gli sviluppatori a migliorare la qualità del codice e a ottimizzare le prestazioni delle applicazioni.