0Pricing
C# Academy · Lezione

Vincoli where

Limiti i parametri di tipo.

Vincoli where è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 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.

Perché esistono i vincoli

Per impostazione predefinita, un parametro di tipo T viene trattato quasi come object, quindi il compilatore consente pochissime operazioni su di esso. I vincoli, scritti con where, forniscono al compilatore maggiori informazioni su T.

Grazie a queste informazioni è possibile chiamare metodi, creare istanze o confrontare valori in sicurezza.

void Show<T>(T value) where T : IFormattable
{
    // now ToString(format, provider) is available
}

Vincoli sulle interfacce

Un vincolo su un'interfaccia richiede che T implementi una determinata interfaccia. Il corpo del metodo può quindi chiamare i membri di quell'interfaccia.

Di seguito, where T : IComparable<T> garantisce l'esistenza di un metodo CompareTo.

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

Vincoli sulla classe base

È possibile richiedere che T derivi da una specifica classe base. In questo caso, all'interno del codice generico è possibile utilizzare i membri di quel tipo base.

È comune nei framework in cui tutte le entità condividono un tipo base.

class Animal { public string Name = ""; }

string NameOf<T>(T a) where T : Animal => a.Name;

Il vincolo class

where T : class richiede che T sia un tipo riferimento. Ciò consente di assegnare null e di verificare l'uguaglianza tra riferimenti.

È tipico per repository, cache e qualsiasi componente che memorizzi riferimenti nullable.

T? FindOrNull<T>(bool found, T value) where T : class
    => found ? value : null;

Il vincolo struct

where T : struct richiede che T sia un tipo valore non nullable. Ciò consente di trattare T come un tipo valore e di utilizzare T? come tipo valore nullable.

Viene utilizzato dagli helper che funzionano solo con numeri, enumerazioni o piccole struct.

T? AsNullable<T>(T value) where T : struct
    => value;

Il vincolo new()

Il vincolo new() richiede che T disponga di un costruttore pubblico senza parametri. Il corpo del metodo può quindi scrivere new T().

Le factory e gli object pool si basano su questo vincolo per creare istanze in modo generico.

using System;

class Program
{
    static T Make<T>() where T : new() => new T();

    static void Main()
    {
        var list = Make<System.Collections.Generic.List<int>>();
        Console.WriteLine(list.Count);
    }
}

Combinare i vincoli

È possibile applicare diversi vincoli a un singolo parametro. Le regole sull'ordine richiedono prima class o struct, poi la classe base, quindi le interfacce e infine new().

I vincoli vengono elencati dopo una singola clausola where, separati da virgole.

T Build<T>() where T : class, IComparable<T>, new()
    => new T();

Più clausole where

Quando un metodo o una classe ha diversi parametri di tipo, ognuno riceve una propria clausola where. Le clausole vengono scritte una dopo l'altra.

In questo modo i vincoli di ciascun parametro restano chiaramente separati.

TResult Convert<TInput, TResult>(TInput x)
    where TInput : class
    where TResult : new()
    => new TResult();

Un esempio eseguibile di vincolo

Questo programma completo utilizza un vincolo IComparable<T> per trovare il maggiore tra due valori, funzionando sia con gli interi sia con le stringhe.

È il vincolo a rendere legale CompareTo all'interno del metodo.

using System;

class Program
{
    static T Max<T>(T a, T b) where T : IComparable<T>
        => a.CompareTo(b) >= 0 ? a : b;

    static void Main()
    {
        Console.WriteLine(Max(3, 9));
        Console.WriteLine(Max("apple", "pear"));
    }
}

I vincoli notnull e unmanaged

Le versioni più recenti di C# aggiungono altri vincoli. where T : notnull vieta i tipi nullable, una caratteristica utile per le chiavi dei dizionari. where T : unmanaged limita T ai tipi valore blittable per il codice di basso livello.

Questi vincoli aumentano la sicurezza in scenari specializzati.

void Use<T>(T key) where T : notnull { }

unsafe void Raw<T>(T v) where T : unmanaged { }

I vincoli abilitano le funzionalità, non le limitano

Sebbene sembrino limitazioni, i vincoli consentono in realtà di accedere a nuove funzionalità. Senza un vincolo si può interagire a malapena con T; con un vincolo si ottengono i relativi membri.

Scelga il vincolo minimo che consente il funzionamento dell'algoritmo, mantenendo il parametro di tipo il più flessibile possibile.

// No constraint: only object members available
string Name<T>(T x) => x.ToString();

Verifica rapida

Verifichi la propria comprensione dei vincoli where.

Riepilogo

La clausola where impone vincoli ai parametri di tipo: interfaccia, classe base, class, struct, new(), notnull e unmanaged. Ogni vincolo abilita operazioni specifiche su T.

Li ordini correttamente, utilizzi una clausola per parametro e scelga il vincolo minimo richiesto dall'algoritmo.

Domande Frequenti

La lezione «Vincoli where» è gratuita?

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

Limiti i parametri di tipo. 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 3 di 4.

Quanto tempo richiede la lezione «Vincoli where»?

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