Это обсуждение старое, и, насколько мне известно, нет единого мнения.
Пожалуйста, не путайте концепцию Duck-Typing (во время выполнения) со злоупотреблением поддерживаемым компилятором foreach
для поддержки желаемой семантики.
Другая концепция, которую вы, кажется, путаете, это идемпотентность и неизменность. Согласно вашей формулировке вы пытаетесь описать второе, что означает, что объект, предоставляющий перечислитель, изменяется во время перечисления. Идемпотентность, с другой стороны, означает, что ваш счетчик, если его вызвать дважды, даст тот же результат.
Теперь, когда мы прояснили это, вам нужно тщательно определиться с семантикой, которую должна поддерживать ваша операция IEnumerable. Определенные виды перечислений трудно сделать идемпотентными (то есть включать кеширование) и обычно делятся на одну из следующих категорий:
- Перечисление в случайном порядке
данные (то есть генератор случайных чисел, потоки датчиков)
- Перечисление по общему состоянию
(например, файлы, базы данных, потоки и т. д.)
С другой стороны, это учитывает только «исходные» операции. Если вы реализуете операции фильтрации или преобразования с использованием перечислителей, всегда старайтесь сделать их идемпотентными.