Ответ 1
Он общедоступен, так что GetEnumerator()
может быть объявлен для его возврата.
Это позволяет компилятору С# использовать его в цикле foreach
... избегая выделения кучи, поскольку List.Enumerator
является структурой. (Изменчивая структура, которая заставляет меня идти "ура!", Но это другая история.)
Поэтому, когда у вас есть что-то вроде:
List<string> list = new List<string> { "..." };
foreach (var item in list)
{
Console.WriteLine(item);
}
Затем компилятор может преобразовать его во что-то вроде:
List<string> list = new List<string> { "..." };
using (List<string>.Enumerator enumerator = list.GetEnumerator())
{
while (enumerator.MoveNext())
{
string item = enumerator.Current;
Console.WriteLine(item);
}
}
Обратите внимание на тип enumerator
здесь - тогда как если бы мы имели:
IEnumerable<string> list = new List<string> { "..." };
foreach (var item in list)
{
Console.WriteLine(item);
}
было бы использовать:
using (IEnumerator<string> enumerator = list.GetEnumerator())
... который включает в себя выделение кучи, так как IEnumerator<string>
является ссылочным типом. Реализация IEnumerable<T>
метода GetEnumerator()
в List<T>
возвращает упакованный List<string>.Enumerator
.