0Pricing
C# Academy · Lezione

Metodi generici

Parametri di tipo nei metodi.

Metodi generici è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 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 cosa sono i metodi generici?

Un metodo generico dichiara uno o più parametri di tipo propri, scritti tra parentesi angolari dopo il nome del metodo. Lo stesso corpo del metodo funziona quindi con molti tipi senza cast né duplicazione.

I parametri di tipo sono segnaposto come T. Il compilatore sostituisce il tipo reale nel punto della chiamata, mantenendo la tipizzazione forte.

void Print<T>(T value)
{
    Console.WriteLine(value);
}

Dichiarare un parametro di tipo

L'elenco dei parametri di tipo <T> si trova tra il nome del metodo e l'elenco dei parametri. È possibile usare T come tipo di parametro, tipo restituito o tipo di una variabile locale all'interno del corpo.

Per convenzione, i parametri di tipo singoli vengono denominati T; sono comuni anche nomi descrittivi come TKey.

T Echo<T>(T input)
{
    return input;
}

Chiamata con inferenza dei tipi

Di solito non si specifica esplicitamente l'argomento di tipo. Il compilatore inferisce T dagli argomenti passati.

Qui Echo(42) deduce T = int, mentre Echo("hi") deduce T = string. L'inferenza dei tipi mantiene le chiamate generiche pulite e leggibili.

using System;

class Program
{
    static T Echo<T>(T input) => input;

    static void Main()
    {
        Console.WriteLine(Echo(42));
        Console.WriteLine(Echo("hi"));
    }
}

Argomenti di tipo espliciti

Quando l'inferenza non riesce a determinare il tipo, oppure si desidera essere espliciti, si fornisca l'argomento di tipo tra parentesi angolari nel punto della chiamata.

Questo è necessario quando nessun argomento contiene il tipo, ad esempio in un metodo il cui T compare solo nel tipo restituito.

T Create<T>() where T : new() => new T();

// call:
var list = Create<int>();

Più parametri di tipo

Un metodo generico può dichiarare diversi parametri di tipo separati da virgole. Ognuno viene dedotto o specificato indipendentemente.

Un esempio classico è uno scambio o un costruttore di coppie che combina due tipi distinti.

(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
    return (b, a);
}

Uno scambio generico

I metodi generici sono particolarmente adatti alle utilità che ignorano il tipo concreto. Uno scambio riordina due valori di qualsiasi tipo compatibile.

La parola chiave ref consente al metodo di modificare direttamente le variabili del chiamante.

using System;

class Program
{
    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    static void Main()
    {
        int x = 1, y = 2;
        Swap(ref x, ref y);
        Console.WriteLine($"{x} {y}");
    }
}

Vincoli sui parametri dei metodi

Un metodo generico può limitare i propri parametri di tipo con una clausola where. I vincoli indicano al compilatore quali operazioni sono consentite su T.

Di seguito, where T : IComparable<T> consente al corpo del metodo di chiamare CompareTo in sicurezza.

T Max<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) >= 0 ? a : b;
}

Metodi generici in classi non generiche

Una classe non deve essere necessariamente generica per contenere metodi generici. Le classi di utilità statiche li contengono comunemente.

In questo modo gli helper di uso generale restano raggruppati senza costringere l'intera classe ad avere un parametro di tipo.

static class Util
{
    public static T First<T>(T[] items) => items[0];
}

Inferenza dagli array

L'inferenza dei tipi funziona anche con gli argomenti costituiti da array e raccolte. Passando un int[], si deduce automaticamente T = int.

Questo fa sì che gli algoritmi generici sembrino funzionalità integrate nel linguaggio.

using System;

class Program
{
    static T First<T>(T[] items) => items[0];

    static void Main()
    {
        int[] nums = { 10, 20, 30 };
        Console.WriteLine(First(nums));
    }
}

Perché non usare semplicemente object?

Prima dei generics, il codice utilizzava object e conversioni di tipo. Questo fa perdere la sicurezza dei tipi e introduce il boxing dei tipi valore, con un peggioramento delle prestazioni.

I metodi generici evitano il boxing per i tipi valore e rilevano gli errori di tipo in fase di compilazione, invece di generare eccezioni in fase di esecuzione.

// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);

Restituire tipi diversi

Anche il tipo restituito può essere generico, consentendo a un metodo di adattare la propria uscita al chiamante. default(T) restituisce il valore predefinito per i tipi valore oppure null per i tipi riferimento.

È utile per gestire in sicurezza i casi alternativi quando non è disponibile alcun valore.

T OrDefault<T>(bool ok, T value)
{
    return ok ? value : default(T);
}

Verifica rapida

Verifichi la propria comprensione dei metodi generici.

Riepilogo

I metodi generici dichiarano i propri parametri di tipo tra parentesi angolari dopo il nome. Di solito il compilatore deduce il tipo dagli argomenti, ma è possibile specificarlo esplicitamente.

Garantiscono la sicurezza dei tipi, evitano il boxing e possono includere vincoli where. È possibile inserirli in qualsiasi classe, generica o meno.

Domande Frequenti

La lezione «Metodi generici» è gratuita?

Sì — il testo completo di «Metodi generici» è 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 «Metodi generici»?

Parametri di tipo nei metodi. 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 1 di 4.

Quanto tempo richiede la lezione «Metodi generici»?

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