Bog'liq CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C
реализация интерфейсов IEnumerable, ICollection и IList Многие методы работают с коллекциями, поскольку они объявлены с такими
параметрами, как интерфейсы
IEnumerable
,
ICollection
и
IList
. Им можно
передавать и массивы, так как эти три необобщенных интерфейса реализованы
в классе
System.Array
. Данная реализация обусловлена тем, что эти интерфейсы
интерпретируют любой элемент как экземпляр
System.Object
. Однако хотелось
бы также, чтобы класс
System.Array
реализовывал обобщенные эквиваленты этих
интерфейсов, обеспечивая лучший контроль типов во время компиляции и повы-
шенную производительность.
Команда разработчиков CLR решила, что не стоит осуществлять реализацию
интерфейсов
IEnumerable ,
ICollection и
IList классом
System.Array
,
так как в этом случае возникают проблемы с многомерными массивами, а также
с массивами, в которых нумерация не начинается с нуля. Ведь определение этих
интерфейсов в указанном классе означает необходимость поддержки массивов
всех типов. Вместо этого разработчики пошли на хитрость: при создании одно-
мерного массива с начинающейся с нуля индексацией CLR автоматически реа-
лизует интерфейсы
IEnumerable ,
ICollection и
IList (здесь
T
— тип
элементов массива), а также три интерфейса для всех базовых типов массива
при условии, что эти типы являются ссылочными. Ситуацию иллюстрирует
следующая иерархия.
Object
Array (необобщенные IEnumerable, ICollection, IList)
Object[] (IEnumerable, ICollection, IList of Object)
String[] (IEnumerable, ICollection, IList of String)
Stream[] (IEnumerable, ICollection, IList of Stream)
FileStream[] (IEnumerable, ICollection, IList of FileStream)
.
. (другие массивы ссылочных типов)
.
Пример:
FileStream[] fsArray;
В этом случае при создании типа
FileStream[]
CLR автоматически реали-
зует в нем интерфейсы
IEnumerable ,
ICollection и
IList . Более того, тип
FileStream[]
будет реализовывать ин-
терфейсы базовых классов
IEnumerable ,
IEnumerable