Classi generiche
Tipi contenitore riutilizzabili.
Classi generiche è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Che cos'è una classe generica?
Una classe generica dichiara uno o più parametri di tipo tra parentesi angolari dopo il nome della classe. Questi parametri possono essere utilizzati per campi, proprietà, firme dei metodi e tipi restituiti all'interno dell'intera classe.
Questo consente di scrivere un unico contenitore o servizio compatibile con molti tipi di elementi, mantenendo al contempo una tipizzazione forte.
class Box<T>
{
public T Value { get; set; }
}Costruire una classe generica
Per creare un'istanza si fornisca un argomento di tipo concreto. Box<int> e Box<string> sono tipi costruiti distinti.
Ogni tipo costruito si comporta come se il suo T fosse sostituito ovunque dal tipo reale.
using System;
class Box<T> { public T Value { get; set; } }
class Program
{
static void Main()
{
var b = new Box<int> { Value = 7 };
Console.WriteLine(b.Value);
}
}Campi e proprietà generici
I parametri di tipo possono essere utilizzati come tipo di campi e proprietà. Uno stack, una coda o una cache spesso memorizza i propri dati in un array o in un elenco di T.
La memoria interna rimane tipizzata in modo sicuro, senza conversioni di tipo.
class Pair<T>
{
public T First;
public T Second;
}Più parametri di tipo
Una classe può accettare diversi parametri di tipo. Un tipo che rappresenta una coppia chiave/valore o un dizionario utilizza comunemente due parametri.
Nomi descrittivi come TKey e TValue migliorano la leggibilità quando è presente più di un parametro.
class Entry<TKey, TValue>
{
public TKey Key { get; set; }
public TValue Value { get; set; }
}Un semplice stack generico
Ecco un piccolo stack generico basato su un List<T>. Push aggiunge un elemento alla fine e Pop lo rimuove dalla fine.
La stessa classe può essere utilizzata con interi, stringhe o qualsiasi tipo riferimento o tipo valore.
using System;
using System.Collections.Generic;
class MyStack<T>
{
private readonly List<T> items = new();
public void Push(T item) => items.Add(item);
public T Pop()
{
var i = items[^1];
items.RemoveAt(items.Count - 1);
return i;
}
}
class Program
{
static void Main()
{
var s = new MyStack<string>();
s.Push("a");
s.Push("b");
Console.WriteLine(s.Pop());
}
}Metodi generici all'interno di classi generiche
Una classe generica può anche dichiarare ulteriori parametri di tipo nei singoli metodi. Questi parametri a livello di metodo sono indipendenti da quelli a livello di classe.
Ciò aggiunge flessibilità, ad esempio consentendo di convertire il tipo memorizzato in un altro tipo.
class Box<T>
{
public T Value;
public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}Vincoli sulla classe
Come i metodi, anche una classe generica può vincolare i propri parametri di tipo con where. Un vincolo si applica a ogni membro che utilizza quel parametro.
Di seguito, where T : class consente l'assegnazione di null e i confronti tra riferimenti.
class Repository<T> where T : class
{
private T current;
public bool IsEmpty => current is null;
}I membri statici sono distinti per tipo
Ogni tipo generico costruito dispone di una propria copia dei campi statici. Counter<int> e Counter<string> tengono traccia di conteggi separati.
Questa è una differenza sottile, ma importante, rispetto alle classi non generiche.
class Counter<T>
{
public static int Count;
}Valori predefiniti nelle classi generiche
All'interno di una classe generica spesso è necessario assegnare un valore iniziale a un campo di tipo T. Si utilizzi default(T) oppure la forma abbreviata default quando il tipo è noto dal contesto.
Restituisce null per i tipi riferimento e il valore zero per i tipi valore.
class Slot<T>
{
public T Value = default!;
public bool HasValue { get; private set; }
}Ereditare da una classe generica
È possibile derivare da una classe generica di base. La sottoclasse può fissare l'argomento di tipo oppure rimanere generica a sua volta.
Fissarlo specializza la classe di base; rimanere generica inoltra il parametro alla classe derivata.
class Box<T> { public T Value; }
class IntBox : Box<int> { }
class NamedBox<T> : Box<T> { public string Name; }I generics e le raccolte integrate
La libreria di base .NET è ricca di classi generiche: List<T>, Dictionary<TKey, TValue> e Queue<T>. Sono il vantaggio concreto che si ottiene ogni giorno progettando classi generiche.
Scrivere i propri tipi generici consente di estendere lo stesso stile sicuro e riutilizzabile.
using System.Collections.Generic;
var scores = new Dictionary<string, int>();
scores["ada"] = 95;Verifica rapida
Verifichi la propria comprensione delle classi generiche.
Riepilogo
Le classi generiche dichiarano i parametri di tipo dopo il nome della classe e li utilizzano per campi, proprietà e metodi. Vengono costruite con argomenti di tipo concreti, creando tipi distinti.
Possono aggiungere parametri di tipo a livello di metodo, includere vincoli where, essere ereditate e contenere stato statico distinto per tipo. Le raccolte integrate ne sono l'esempio principale.
Domande Frequenti
La lezione «Classi generiche» è gratuita?
Sì — il testo completo di «Classi generiche» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Classi generiche»?
Tipi contenitore riutilizzabili. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Classi generiche»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Metodi generici
- Classi generiche
- Vincoli where
- Interfacce generiche