Мне стало интересно, как работает данный цикл именно с технической стороны, ведь ему можно передавать как массивы, коллекции, так и словари. Хочу создать свой собственный класс и сделать его совместимым с циклом foreach.
Для того, что бы созданный Вами класс был совместим с циклом foreach, он должен реализовать два интерфейса: IEnumerable, IEnumerator. Причём необязательно, что бы было указание, что он наследуется от них - достаточно реализации методов с теми же объявлениями.
Сам же цикл foreach работает следующим образом:
ArrayList сoll = new ArrayList();
сoll.Add(1);
сoll.Add("21e31");
сoll.Add(3);
сoll.Add(2);
IEnumerator enumerator = (сoll as IEnumerable).GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine( enumerator.Current.ToString());
}
если класс будет также реализовать интерфейс IDisposable, то после выполнения цикла while произойдёт вызов его метода Dispose
члены интерфейса IEnumerable:
- IEnumerator GetEnumerator();
члены интерфейса IEnumerator:
- object Current { get; }
- bool MoveNext();
- void Reset();
члены интерфейса IDisposable:
- void Dispose();
Александр Шевчук в своём видеоуроке достаточно подробно это рассматривает.
Спасибо!