Универсальные интерфейсы в .NET

В этой статье представлен обзор . Универсальные интерфейсы NET, обеспечивающие общие функциональные возможности в семействах универсальных типов.

Универсальные интерфейсы предоставляют типобезопасные аналоги для негенерических интерфейсов для сравнения порядка и равенства, а также для функциональных возможностей, совместно используемых универсальными типами коллекций. В .NET 7 представлены универсальные интерфейсы для типов, таких как число, например System.Numerics.INumber<TSelf>. Эти интерфейсы позволяют определять универсальные методы, предоставляющие математические функции, где параметр универсального типа ограничен типом, реализующим универсальный, числовой интерфейс.

Примечание.

Параметры типов нескольких универсальных интерфейсов помечены как ковариантные или контрвариантные, что обеспечивает дополнительную гибкость при назначении и использовании типов, реализующих эти интерфейсы. Дополнительные сведения см. в разделе Ковариация и контравариантность.

Упорядочение и сравнение на равенство

  • В пространстве имен System универсальные интерфейсы System.IComparable<T> и System.IEquatable<T>, как и их неуниверсальные аналоги, определяют методы для упорядочения и сравнения на равенство соответственно. Типы реализуют эти интерфейсы для предоставления способности выполнять такие сравнения.

  • System.Collections.Generic В пространстве IComparer<T> имен и IEqualityComparer<T> универсальные интерфейсы предлагают способ определения упорядочения или сравнения равенства для типов, которые не реализуют интерфейс или System.IEquatable<T> упорядочениеSystem.IComparable<T>. Они также предоставляют способ переопределить эти отношения для типов, которые делают.

    Эти интерфейсы используются методами и конструкторами многих универсальных классов коллекций. Например, можно передать универсальный объект IComparer<T> в конструктор класса SortedDictionary<TKey,TValue>, чтобы указать порядок сортировки для типа, который не реализует универсальный интерфейс System.IComparable<T>. Предусмотрены перегрузки универсального статического метода Array.Sort и метода экземпляра List<T>.Sort для сортировки массивов и списков с помощью реализаций универсального интерфейса IComparer<T>.

    Классы Comparer<T> и EqualityComparer<T> универсальные классы предоставляют базовые классы для реализации IComparer<T> и IEqualityComparer<T> универсальных интерфейсов, а также обеспечивают сравнение порядка по умолчанию и равенства с помощью соответствующих Comparer<T>.Default и EqualityComparer<T>.Default свойств.

Функции коллекции

  • Универсальный интерфейс ICollection<T> представляет собой базовый интерфейс для универсальных типов коллекций. Он предоставляет базовые функции для добавления, удаления, копирования и перечисления элементов. ICollection<T> наследуется от универсального интерфейса IEnumerable<T> и неуниверсального интерфейса IEnumerable.

  • Универсальный интерфейс IList<T> расширяет универсальный интерфейс ICollection<T> с помощью методов для получения элементов по индексу.

  • Универсальный интерфейс IDictionary<TKey,TValue> расширяет универсальный интерфейс ICollection<T> с помощью методов для получения элементов по ключу. Универсальные типы словарей в библиотеке базовых классов .NET также реализуют неуниверсальный интерфейс IDictionary.

  • Универсальный интерфейс IEnumerable<T> предоставляет структуру универсального перечислителя. Универсальный интерфейс IEnumerator<T>, реализуемый универсальными перечислителями, наследуется от неуниверсального интерфейса IEnumerator. Члены MoveNext и Reset, которые не зависят от параметра типа T, присутствуют только в неуниверсальном интерфейсе. Это означает, что любой потребитель неуниверсального интерфейса также может использовать универсальный интерфейс.

Математические функции

В .NET 7 представлены универсальные интерфейсы в System.Numerics пространстве имен, описывающих типы числа и доступные для них функции. 20 числовых типов, которые предоставляет библиотека базовых классов .NET, например, Int32 и Doubleбыли обновлены для реализации этих интерфейсов. Наиболее заметным из этих интерфейсов является INumber<TSelf>то, что примерно соответствует "реальному" числу.

Дополнительные сведения об этих интерфейсах см. в разделе "Универсальная математика".

См. также