Шрифт:
Многие из этих интерфейсов связаны иерархией интерфейсов, в то время как другие являются автономными единицами. На рис. 7.12 показана схема взаимосвязей между указанными типами (напомним, что один интерфейс может быть производным от нескольких интерфейсов).
Рис. 7.12. Иерархия интерфейсов System.Collections
Интерфейс ICollection
Интерфейс ICollection является простейшим интерфейсом пространства имен System.Collections в том смысле, что этот интерфейс определяет поведение, поддерживаемое любым типом коллекции. По сути, этот интерфейс обеспечивает узкий набор свойств, которые позволяют определить: а) число элементов в контейнере; б) защищенность цепочки контейнера; в) возможность копирования содержимого в тип System.Array. Формально ICollection определяется так, как показано ниже (обратите внимание на то, что ICollection расширяет IEnumerable).
Интерфейс IDictionary
Вы, возможно, знаете, что словарь – это коллекция, обеспечивающая поддержку пар имен и их значений. Например, можно построить пользовательский тип, реализующий IDictionary, в котором вы сможете сохранить типы Car (значения) с возможностью их последующего восстановления по ID или petName (это примеры имен). Интерфейс IDictionary определяет свойства Keys и Values, а также методы Add, Remove и Contains. Отдельные элементы можно получить c помощью индексатора типа. Вот формальное определение.
Интерфейс IDictionaryEnumerator
При внимательном чтении вы могли заметить, что IDictionary.GetEnumerator возвращает экземпляр IDictionaryEnumerator. Тип IDictionaryEnumerator – это строго типизованный нумератор, расширяющий IEnumerator путем добавления следующей функциональной возможности.
Обратите внимание на то, что IDictionaryEnumerator обеспечивает возможность перечисления элементов словаря с помощью общего свойства Entry, которое возвращает тип класса System.Collections.DictionaryEntry. Кроме того, вы можете выполнить цикл по парам имен и значений, используя свойства Key/Value.
Интерфейс IList
Последним из ключевых интерфейсов System.Collections является интерфейс IList, который обеспечивает возможность вставки, удаления и индексирования элементов контейнера.
Классы из пространства имен System.Collections
Еще раз подчеркнем, что интерфейсы остаются бесполезными до тех пор, пока они не реализованы соответствующим классом или соответствующей структурой. В табл. 7.3 предлагаются описания основных классов из пространства имен System.Collections вместе с ключевыми интерфейсами, которые этими классами поддерживаются.
Таблица 7.3. Классы System.Collections
Класс | Описание | Реализуемые интерфейсы |
---|---|---|
ArrayList | Представляет динамически изменяемый по размерам массив объектов | IList, ICollection, IEnumerable, ICloneable |
Hashtable | Представляет коллекцию объектов, идентифицируемых по числовому ключу. Пользовательские типы, хранимые в Hashtable, должны обязательно переопределять System.Object.GetHashCode | IDictionary, ICollection, IEnumerable, ICloneable |
Queue | Представляет стандартную очередь FIFO (first-in, first-out – первым прибыл, первым обслужен) | ICollection, ICloneable, IEnumerable |
SortedList | Подобен словарю, но здесь элементы могут быть также доступны по позиции (например, по индексу) | IDictionary, ICollection, IEnumerable, ICloneable |
Stack | Очередь LIFO (last-in, first-out – последним прибыл, первым обслужен), обеспечивающая функциональные возможности стека | ICollection, ICloneable, IEnumerable |