Страницы

Поиск по вопросам

пятница, 12 апреля 2019 г.

Теория. Применение IEnumerator и yield в Unity3D

Часто вижу в разных статьях и справочниках по программированию в Unity3D использование интервфейса IEnumerator. Но не могу найти точную информацию о его практической необходимости. Расскажите, пожалуйста, подробно. Чем обусловлена необходимость использования этого интерфейса. Теоретические статьи и примеры желательно на русском языке.
С наилучшими пожеланиями, Любитель. P.S Спасибо Алексею за ссылку на этот урок. Он подробный. Пару дней практики по вашим ответам и тема освоена.


Ответ

IEnumerator прямого отношения к Unity не имеет. Это интерфейс из C# "вообще". Он (а точнее, класс, его реализующий) определяет правила перебора некой коллекции. Наверняка вам известен цикл foreach - он позволяет пройтись по всем элементам некой коллекции, причем, в отличие от цикла for программист может позволить себе не забивать голову контролем выхода за границы коллекции. Однако чтобы ваш класс (коллекцию) можно было скормить этому циклу, необходимо, чтобы у него был метод GetEnumerator (тут стоит упомянуть распространенное заблуждение, что для foreach нужен класс, реализующий IEnumerable. Это не так. Ему подойдет любой класс, имеющий метод GetEnumerator с соответствующей сигнатурой и возвращаемым значением). А GetEnumerator как раз должен возвращать экземпляр класса, реализующий IEnumerator, в котором описывается вся логика перебора коллекции.
Необходимость самостоятельно реализовывать IEnumerator возникает нечасто, возможностей встроенных коллекций обычно бывает вполне достаточно для выполнения большинства задач. Возможной причиной для самостоятельной реализации этого интерфейса является необходимость определить какие-то нестандартные правила перебора некой коллекции. Например, если вы хотите, чтобы в коллекции перебирался каждый второй ее элемент.
Стоит также отметить, что этот интерфейс часто используется в связке с IEnumerable, который имеет единственный метод
IEnumerator GetEnumerator()
или для обобщенного варианта
IEnumerator GetEnumerator()
Теперь пару слов про yield. Это удобный синтаксический сахар, который позволяет вместо довольно утомительной реализации IEnumerator определить правила перебора какой-либо коллекции. Вы пишете довольно простой метод, а компилятор за кулисами выполняет всю черновую работу по реализации итератора. Более подробно можно почитать например тут или здесь

Комментариев нет:

Отправить комментарий