static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Есть код, всё работает.
Хочу сделать класс SampleEnumerator статическим. Делаю:
Цитата: Цитата: Вопрос - чего не хватает? Исправлено 3 раз(а). Последнее : S-type, 26.02.17 22:37 |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
В то же время, если сделать:
всё работает "как надо".
Цитата: Исправлено 4 раз(а). Последнее : S-type, 26.02.17 22:13 |
Re: static IEnumerator | |
---|---|
Рома Сообщений: 1079 Дата регистрации: 06.06.2001 |
1) StaticSample.GetEnumerator().GetEnumerator() - честный IEnumerator 2) new StaticSample().GetGnumerator() - возвращает IEnumerable<int> который не похож на IEnumerator, о чем намекает сообщение. IEnumerable (последовательность) и IEnumerator (указатель на текущий элемент последовательности) не одно и то же. Исправлено 1 раз(а). Последнее : Рома, 26.02.17 20:07 |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Спасибо за подсказку. Подкорректировал выложенный мной пример. |
Re: static IEnumerator | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Минимальный пример - статический метод в том же самом классе.
На самом деле этот безобидный код компилируется в весьма нехилую структуру с полноценной state-машиной:
Мануал про всё это пишет достаточно подробно, даже про Technical Implementation...
------------------ WBR, Igor |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Таки прозвучало слово Итератор... Что же это такое? В приведённой ссылке сказано:
Цитата: В старой версии страницы есть русский язык msdn.microsoft.com , там сказано: Цитата: Но, самого определения, что такое "итератор" - не даётся. На msdn.microsoft.com (но, это не для C#, а для C++) сказано Цитата: Т.е. итератор, это объект. Но, не каждый объект является итератором, а тот который: Цитата: Цитата: Вот тут начинаются непонятки. Покопался, на msdn.microsoft.com сказано: Цитата: Значит, надо различать итератор (объект) и метод итератора. Так? Выходит, любой метод, возвращающий IEnumerable или IEnumerator это метод итератор (а сам объект - итератор)? Или, какой то другой принцип? Я правильно понимаю, что метод итератора не обязательно должен содержать yield? И, где здесь get? Исправлено 2 раз(а). Последнее : S-type, 27.02.17 23:22 |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Попробовал посмотреть викиедию ru.wikipedia.org - вообще взорвали мозг
Цитата: Исправлено 1 раз(а). Последнее : S-type, 27.02.17 23:13 |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Вот ещё msdn.microsoft.com
Цитата: Полез глубже в интернет, вижу metanit.com : Цитата: Е маё... Что это за зверь такой "итератор"? Исправлено 1 раз(а). Последнее : S-type, 28.02.17 13:48 |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Вот такой пример:
С одной стороны, foreach работает (слава уткам, позор сильной типизации), с другой стороны - IEnumerator тут вовсе упомянут. Понятно, что Current, MoveNext() это из IEnumerator, но интерфейс не реализован - Reset() то отсутствует! Где здесь итератор? Исправлено 1 раз(а). Последнее : S-type, 27.02.17 23:58 |
Re: static IEnumerator | |
---|---|
Рома Сообщений: 1079 Дата регистрации: 06.06.2001 |
Вот что бывает после чтения википедии Лучше сразу стандарт языка почитать - там все четко описано. Например, C++ В C# то же самое. только вместо increment (++) - MoveNext(), а вместо dereference (*) - Current То есть, итератор - это указатель на элемент последовательности (я, кстати, выше это уже писал). Ни в C++, ни в С# не требуется реализации интерфейса. Есть соглашение, что должен иметь объект, чтобы считаться итератором. Аналогично и для IEnumerable(C#) или Container(C++) есть соглашение В С# - нужен метод GetEnumerator() В С++ - нужна пара begin()/end() |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Т.е. в первой фразе "итератор - это указатель", а во второй "объект" |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Т.е. в C# итератор, это объект, у которого есть метод MoveNext() и свойство Current. Так? Выходит, GetEnumerator() возвращает итератор, но сам объект, в котором реализован GetEnumerator(), итератором не является. Так? Немножко изменю приведённый выше пример:
Тут итератор это класс Enumerator? Или, в данном случае итератор "разрезан" на два класса (Enumerator + Collection)? |
Re: static IEnumerator | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Вот зря, зря употребил термин "указатель"... У него совсем другое значение... Всё же тип а не объект... Так. Он является реализатором интерфейса IEnumerable (при том реализация foreach такова, что собственно "интерфейсы" не используются - по сути как в фоксе - интерфейсом в данном случае служит банально "название метода") msdn.microsoft.com Всё описано, включая пример сходный с твоим. И указаны некоторые особенности - про тот же Reset написано, который foreach не использует. Да. Просто зачастую такой класс делают nested классом в том классе-коллекции которую он обслуживает. В принципе не воспрещается и в самом классе-коллекции соответствующие методы реализовать, возвращая тривиально this из метода GetEnumerator() как в твоём раннем примере, хотя это явное нарушение принципа "единственной ответственности" (S в SOLID). ------------------ WBR, Igor |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
IMHO, любая крайность - это опасно. И, если следовать принципу SOLID, то программа теряет "читательность" - очень тяжело лазить по куче классов, "запихивая" их в голову, что бы потом понять - что же этот код делает. S - явно не для меня |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Это и называется - утиная типизация. Интересно, где то ещё в C# есть утиная типизация? |
Re: static IEnumerator | |
---|---|
Рома Сообщений: 1079 Дата регистрации: 06.06.2001 |
"object that, pointing to some element in a range of elements" чем не указатель? Другое значение - какое? Если memory pointer, то это частный случай итератора. И в VFP никого не смущает понятие "record pointer", которое тесно связано с множеством методов итерации по курсору (SKIP,GO,SCAN...) |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Кстати, в ru.wikipedia.org сказано: Цитата: |
Re: static IEnumerator | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Подытожу. Если что не так - поправляйте.
В программировании итератор — это секция кода (метод), возвращающая упорядоченную последовательность значений одинакового типа. В C# итератор, это класс, у которого есть: Классы, реализующие IEnumerator или IEnumerator<T> - это итераторы. Так же, неявно, итератор можно реализовать с помощью IEnumerable, IEnumerable<T>. До появления yield необходимо было реализовывать IEnumerable, а так же описывать отдельный класс для реализации IEnumerator. Интерфейс IEnumerable (или IEnumerable<T> ) позволяет использовать в цикле foreach итераторы, реализованные с помощью IEnumerator. Исправлено 1 раз(а). Последнее : S-type, 01.03.17 23:27 |
Re: static IEnumerator | |
---|---|
alex; Сообщений: 2850 Откуда: Москва Дата регистрации: 23.11.2004 |
итератор — это интерфейс, т.е. набор свойств и методов доступа и навигации не? оператор ++ это же метод как бы, и используется для навигации в плюсах точно. Исправлено 2 раз(а). Последнее : alex;, 01.03.17 23:54 |
Re: static IEnumerator | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В плюсах - возможно (хотя в википедии написано совсем обратное Цитата:), в шарпе - скорее нет чем да. Т.к. там Pointer types совершенно конкретно отделены от Iterators. И хотя у указателей есть и * и ++, но это СОВСЕМ другой зверь... Опять же, то что имеет с десяток различных вариантов использования (та же pointer arithmetic, сравнение указателей, прямая индексация, небезопасное приведение типов) никак не может быть "частным случаем". "Частный случай" это как раз встроенные классы-коллекции реализующие IEnumerable... ------------------ WBR, Igor |
© 2000-2024 Fox Club  |