|
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 18
|
|||||||||||
Непонятный код из примера с сайта MSDN. Реализация IEnumerable31.08.2020, 13:03. Показов 3350. Ответов 28
Приветствую, друзья.
Изучал статью по интерфейсу IEnumerator на сайте MSDN. https://docs.microsoft.com/ru-... etcore-3.1 И в примере к статье увидел, очень заинтриговавший меня, код в пользовательском классе-коллекции, реализующем интерфейс IEnumerable:
Я вполне понимаю, что эти примеры пишут довольно опытные программисты и сделали так по какой то, еще не известной мне, причине. Мне очень интересна эта причина. Поделитесь, пожалуйста, кто знает.
0
|
|||||||||||
| 31.08.2020, 13:03 | |
|
Ответы с готовыми решениями:
28
Msdn IEnumerable и MVC# 2013 разница в синтаксисе Непонятный момент с IEnumerable Ошибка при использовании Tooltip из примера с MSDN |
|
Пора на C++?
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
|
||
| 31.08.2020, 13:08 | ||
|
0
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|||||||
| 31.08.2020, 13:15 | |||||||
|
loyalist28,
Если вы глянете на интерфейс IEnumerable<T>, то увидите следующее:
Поскольку IEnumerable нас тут не особо интересует, делаем его приватным.
0
|
|||||||
|
Администратор
|
||
| 31.08.2020, 13:35 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 18
|
||||
| 31.08.2020, 13:43 [ТС] | ||||
|
Добавлено через 1 минуту Добавлено через 1 минуту
0
|
||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 31.08.2020, 13:44 | |||||
Сообщение было отмечено loyalist28 как решение
РешениеПример не самый лучший из-за того, что PeopleEnum — класс; обычно такое делается в целях оптимизации: чтобы использовать значимые типы и не плодить мусор в куче при каждом переборе. Если сделать PeopleEnum struct'ом, то разница будет очень заметна. Ну и для оптимизации, как сказано выше. Правда, не в этом примере.
1
|
|||||
|
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 18
|
||||
| 31.08.2020, 13:59 [ТС] | ||||
|
Добавлено через 1 минуту Добавлено через 44 секунды Но это, как я понял, если мы сами вызывать будем где то в коде, верно? Циклы foreach и for используют переменную IEnumerator внутри себя для работы, так что использоваться будут явные реализации. Или я ошибаюсь?
0
|
||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|||
| 31.08.2020, 14:03 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 18
|
||
| 31.08.2020, 14:15 [ТС] | ||
|
0
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
||||||
| 31.08.2020, 14:23 | ||||||
|
Явная реализация используется когда тип объявляенной переменной - это тип интерфейса
То есть если взять пример с MSDN:
1
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||
| 31.08.2020, 14:23 | ||||||||||
Сообщение было отмечено loyalist28 как решение
РешениеВопрос в том, насколько рано и насколько поздно: сразу же по завершении работы метода (в основном) или "когда-нибудь потом".
Грубо говоря, для работы foreach не нужно реализовывать IEnumerable/IEnumerator — достаточно чтобы тип, используемый в форыче, имел метод GetEnumerator, не принимающий аргументов и возвращающий тип, у которого есть свойство Current и метод MoveNext, не принимающий аргументов и возвращающий bool. Если такие методы недоступны, тогда уже проверяются явные реализации интерфейсов.
1
|
||||||||||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|||
| 31.08.2020, 14:40 | |||
|
Скорее всего, это просто для наглядности. Вот, мол, есть текущий объект в кастомном Enumerator-е и наша явная реализация его использует.
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 31.08.2020, 14:56 | ||
|
Если публичное свойство Current возвращает нужный тип, то каст не нужен. Естественно, если обращение производится не через переменную интерфейсного типа, но для этого и имеется GetEnumerator, возвращающий конкретный тип.
2
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
||||||
| 31.08.2020, 15:06 | ||||||
|
kolorotur, эм, не пойму, берем пример из MSDN, убираем каст к Person в foreach, и это не компилируется.
Type inference не происходит, если я правильно понял.
То есть IEnumerable как был со своими недостатками, так и остался, лучше мы не сделали. Отдельные члены нужных типов в реализациях интерфейсов - просто для наглядности.
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 31.08.2020, 15:11 | |
|
1
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|
| 31.08.2020, 15:13 | |
|
А, все, отбой, не заметил ,что кастомный GetEnumerator - приватный, сделал публичным - все зафурычило.
0
|
|
|
0 / 0 / 0
Регистрация: 24.04.2020
Сообщений: 18
|
|||
| 31.08.2020, 15:32 [ТС] | |||
|
Добавлено через 5 минут
0
|
|||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
||
| 31.08.2020, 15:34 | ||
|
0
|
||
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|
| 31.08.2020, 15:36 | |
|
Это из примера:
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
|
|
| 31.08.2020, 15:39 | |
|
А если привести к интерфейсу IEnumerable, то перечисление будет происходить уже в типах интерфейса IEnumerable:
1
|
|
| 31.08.2020, 15:39 | |
|
Помогаю со студенческими работами здесь
20
Реализация IEnumerable
Реализация IEnumerable, IEnumerator Реализация интерфейса IEnumerable<T> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|