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
- Metodi generici
- Classi generiche
- Vincoli where
- Interfacce generiche