Интерфейсы lEnumerable и lEnumerator

net поддержка для них предусмотрена

Поскольку интерфейсы LEnumerable И LEnumerator Образуют фундаментальную модель. NET, поддержка для них предусмотрена на уровне языка. Как в С#, так и в VB. NET имеется конструкция Foreach, Позволяющая осуществить итерацию по коллекции совсем просто: За операцией Foreach Скрыта описанная выше итерация по коллекции, использующая свойство Current И метод MoveNext Из интерфейса LEnumerator Объекта, который возвращается методом GetEnumerator. Генерируемый код на промежуточном языке IL на самом деле не использует для доступа к текущему элементу ссылку на интерфейс LEnumerator; Он просто обращается к свойству Current Самого объекта. Поэтому, если реализующий интерфейс LEnumerator Тип содержит свойство

Current, Возвращающее экземпляр конкретного типа , Цикл Foreach Может избежать упаковки и распаковки этих значений при итерации по коллекции. Подробности того, почему Foreach Реализуется подобным образом, приводятся ниже в рубрике «Проблема с небезопасным по типу перечислением». При реализации в. NET 2.0 коллекций, которые будут содержать конкретные типы, вы должны реализовать также обобщенные версии этих интерфейсов, LEnumerable<T> И IEnumerator<T>. Обобщенные типы интерфейсов используются в. NET 2.0 для обеспечения типовой безопасности для содержащихся в коллекции типов, а также чтобы избежать издержек производительности, которые могут возникать при использовании интерфейсов LEnumerable И LEnumerator В коллекциях, содержащих типы-значения. Для нетипизированных интерфейсов все равно остается место; они используются в. NET привязанными элементами управления, поскольку последние не должны делать предположений о конкретных типах в коллекциях, которые вы собираетесь привязывать, так как это ограничило бы их возможные сценарии привязки. В интерфейс LEnumerator<T> Не включен метод Reset, Чтобы упростить реализацию объектов-перечислителей. Для простых коллекций, где используется непосредственная индексация массива объектов, сброс перечислителя не представляет проблемы. Но в более сложных сценариях реализация метода Reset Может стать непростой задачей, не стоящей затраченных усилий.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *