Поскольку примеров не было приведено, вот один из полезных для меня вопросов.
Перечислитель - это объект, который вы получаете при вызове .GetEnumerator() для класса или типа, реализующего интерфейс IEnumerator. Когда этот интерфейс реализован, вы создали весь код, необходимый для компилятора, чтобы вы могли использовать foreach
для «итерации» по вашей коллекции.
Не заставляйте это слово «итерацию» путать с итератором. И перечисление, и итератор позволяют вам «итерации». Перечисление и итерация - это в основном один и тот же процесс, но выполняются по-разному. Перечисление означает, что вы импровизировал интерфейс IEnumerator. Итерация означает, что вы создали конструкцию итератора в своем классе (показано ниже), и вы вызываете foreach
на свой класс, и в это время компилятор автоматически создает для вас функции перечисления.
Также примечание что вам не нужно приседать с вашим перечислителем. Вы можете позвонить MyClass.GetEnumerator()
весь день и ничего не делать с ним (например:
IEnumerator myEnumeratorThatIWillDoNothingWith = MyClass.GetEnumerator()
).
Обратите внимание, что ваш конструктор итератора в вашем классе только реально используется, когда вы на самом деле его используете, т. Е. Вы вызывали foreach
на свой класс.
Вот пример итератора из msdn:
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
//This is the iterator!!!
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach - this is using the iterator!!! When the compiler
//detects your iterator, it will automatically generate the Current,
//MoveNext and Dispose methods of the IEnumerator or IEnumerator<T> interface
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat
В C#, однако, итератор представляет собой специфическую специальную конструкцию, а также только глагол, описывающий этот термин. Перечислитель также является конкретным интерфейсом. Эти два имеют совершенно другое значение в C#, а также обычные члены OO. –
О да, вы правы. В моих терминах это все перечисляется, и я полностью забыл, что C# вызывает этот итератор шаблона. –