Таким образом, необобщенные коллекции могут служить для хранения данных любого типа, причем в одной коллекции допускается наличие разнотипных данных. Очевидно, что такие коллекции не типизированы, поскольку в них хранятся ссылки на данные типа object
. Классы и интерфейсы необобщенных коллекций находятся в пространстве имен System.Collections
.
Специальные коллекции оперируют данными конкретного типа или же делают это каким-то особым образом. Например, имеются специальные коллекции для символьных строк, а также специальные коллекции, в которых используется однонаправленный список. Специальные коллекции объявляются в пространстве имен System.Collections.Specialized
.
В прикладном интерфейсе Collections API определена одна коллекция с поразрядной организацией — это BitArray
. Коллекция типа BitArray
поддерживает поразрядные операции, т.е. операции над отдельными двоичными разрядами, например И или исключающее ИЛИ, а следовательно, она существенно отличается своими возможностями от остальных типов коллекций. Коллекция типа BitArray
объявляется в пространстве имен System.Collections
.
Обобщенные коллекции обеспечивают обобщенную реализацию нескольких стандартных структур данных, включая связные списки, стеки, очереди и словари. Такие коллекции являются типизированными в силу их обобщенного характера. Это означает, что в обобщенной коллекции могут храниться только такие элементы данных, которые совместимы по типу с данной коллекцией. Благодаря этому исключается случайное несовпадение типов. Обобщенные коллекции объявляются в пространстве имен System.Collections.Generic
.
Параллельные коллекции поддерживают многопоточный доступ к коллекции. Это обобщенные коллекции, определенные в пространстве имен System.Collections.Concurrent
.
В пространстве имен System.Collections.ObjectModel
находится также ряд классов, поддерживающих создание пользователями собственных обобщенных коллекций.
Основополагающим для всех коллекций является понятие IEnumerator
и IEnumerable
, а также в обобщенных интерфейсах IEnumerator
и IEnumerable
. Перечислитель обеспечивает стандартный способ поочередного доступа к элементам коллекции. Следовательно, он IEnumerable
, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе IEnumerator
или IEnumerator
. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа. Любопытно, что для поочередного обращения к содержимому коллекции в цикле foreach используется перечислитель.
Основополагающим для всех коллекций является понятие IEnumerator
и IEnumerable
, а также в обобщенных интерфейсах IEnumerator
и IEnumerable
. Перечислитель обеспечивает стандартный способ поочередного доступа к элементам коллекции. Следовательно, он IEnumerable
, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе IEnumerator
или IEnumerator
. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа. Любопытно, что для поочередного обращения к содержимому коллекции в цикле foreach
используется перечислитель.
С перечислителем непосредственно связано другое средство, называемое foreach
. Итераторы также рассматриваются в этой главе.
И последнее замечание: если у вас имеется некоторый опыт программирования на C++, то вам, вероятно, будет полезно знать, что классы коллекций по своей сути подобны классам стандартной библиотеки шаблонов (Standard Template Library — STL), определенной в C++. То, что в программировании на C++ называется