0Pricing
C# Academy · Lezione

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

  1. Metodi generici
  2. Classi generiche
  3. Vincoli where
  4. Interfacce generiche
← Torna a C# Academy