Interfacce generiche in .NET
Questo articolo fornisce una panoramica delle interfacce generiche di .NET che forniscono funzionalità comuni a famiglie di tipi generici.
Le interfacce generiche forniscono controparti indipendenti dai tipi a interfacce non generiche per confronti di uguaglianza e ordinamento, e per le funzionalità condivise da tipi di raccolta generici. .NET 7 introduce interfacce generiche per tipi simili a numeri, ad esempio System.Numerics.INumber<TSelf>. Queste interfacce consentono di definire metodi generici che forniscono funzioni matematiche, in cui il parametro di tipo generico è vincolato a un tipo che implementa un'interfaccia generica numerica.
Nota
I parametri di tipo di diverse interfacce generiche vengono contrassegnati come covariante o controvariante, fornendo più flessibilità nell'assegnazione e nell'uso di tipi che implementano queste interfacce. Per altre informazioni, vedere Covarianza e controvarianza.
Confronti di uguaglianza e ordinamento
Nello spazio dei nomi System le interfacce generiche System.IComparable<T> e System.IEquatable<T>, analogamente alle relative controparti non generiche, definiscono rispettivamente i metodi per i confronti di ordinamento e quelli per i confronti di uguaglianza. I tipi implementano queste interfacce per consentire l'esecuzione di questi confronti.
Nello spazio dei nomi System.Collections.Generic le interfacce generiche IComparer<T> e IEqualityComparer<T> offrono un modo per definire un confronto di ordinamento o uguaglianza per i tipi che non implementano l'interfaccia System.IComparable<T> o System.IEquatable<T>. Inoltre offrono un modo per ridefinire le relazioni per i tipi che le implementano.
Queste interfacce sono usate da metodi e costruttori di molte delle classi di raccolta generiche. È ad esempio possibile passare un oggetto generico IComparer<T> al costruttore della classe SortedDictionary<TKey,TValue> per specificare un ordinamento per un tipo che non implementa un'interfaccia generica System.IComparable<T>. Sono presenti overload del metodo statico generico Array.Sort e del metodo di istanza List<T>.Sort che consentono l'ordinamento di matrici ed elenchi mediante implementazioni generiche di IComparer<T>.
Le classi generiche Comparer<T> e EqualityComparer<T> forniscono classi base per le implementazioni delle interfacce generiche IComparer<T> e IEqualityComparer<T>, nonché confronti di ordinamento e uguaglianza predefiniti mediante le rispettive proprietà Comparer<T>.Default e EqualityComparer<T>.Default.
Funzione di raccolta
L'interfaccia generica ICollection<T> è l'interfaccia di base per i tipi di raccolta generici. Fornisce la funzionalità di base per l'aggiunta, la rimozione, la copia e l'enumerazione degli elementi. ICollection<T> eredita da interfacce IEnumerable<T> generiche e IEnumerable non generiche.
L'interfaccia generica IList<T> estende l'interfaccia generica ICollection<T> con metodi per il recupero indicizzato.
L'interfaccia generica IDictionary<TKey,TValue> estende l'interfaccia generica ICollection<T> con metodi per il recupero con chiavi. Anche i tipi di dizionari generici della libreria di classi base .NET implementano l'interfaccia IDictionary non generica.
L'interfaccia generica IEnumerable<T> fornisce una struttura di enumeratori generici. L'interfaccia generica IEnumerator<T> implementata dagli enumeratori generici eredita l'interfaccia IEnumerator non generica e i membri MoveNext e Reset, che non dipendono dal parametro di tipo
T
, vengono visualizzati solo sull'interfaccia non generica. Di conseguenza, qualsiasi consumer dell'interfaccia non generica può usare anche l'interfaccia generica.
Funzione matematica
.NET 7 introduce interfacce generiche nello spazio dei nomi System.Numerics che descrivono tipi di genere numerico e le funzioni disponibili. I 20 tipi numerici forniti dalla libreria di classi di base .NET, ad esempio Int32 e Double, sono stati aggiornati per implementare queste interfacce. La più importante di queste interfacce è INumber<TSelf>, che corrisponde approssimativamente a un numero "reale".
Per altre informazioni su queste interfacce, vedere Matematica generica.