Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 176
- Предыдущая
- 176/642
- Следующая
// Вручную работать с IEnumerator.
IEnumerator carEnumerator = carLot.GetEnumerator();
carEnumerator.MoveNext();
Car myCar = (Car)i.Current;
Console.WriteLine("{0} is going {1} MPH", myCar.PetName, myCar.CurrentSpeed);
Тем не менее, если вы предпочитаете скрыть функциональность
IEnumerable
// Возвратить IEnumerator объекта массива.
IEnumerator IEnumerable.GetEnumerator()
=> return carArray.GetEnumerator();
В результате обычный пользователь объекта не обнаружит метод
GetEnumerator()
Garage
foreach
Построение итераторных методов с использованием ключевого слова yield
Существует альтернативный способ построения типов, которые работают с циклом
foreach
foreach
CustomEnumeratorWithYield
Car
Radio
Garage
Garage
public class Garage : IEnumerable
{
...
<b> // Итераторный метод.</b>
public IEnumerator GetEnumerator()
{
foreach (Car c in carArray)
{
yield return c;
}
}
}
Обратите внимание, что показанная реализация метода
GetEnumerator()
foreach
Car
yield return
yield
foreach
yield return
Итераторные методы не обязаны использовать ключевое слово
foreach
public IEnumerator GetEnumerator()
{
yield return carArray[0];
yield return carArray[1];
yield return carArray[2];
yield return carArray[3];
}
В этой реализации обратите внимание на то, что при каждом своем прохождении метод
GetEnumerator()
carArray
GetEnumerator()
foreach
Защитные конструкции с использованием локальных функций (нововведение в версии 7.0)
До первого прохода по элементам (или доступа к любому элементу) никакой код в методе
GetEnumerator()
yield
MoveNext()
Чтобы проверить это, модифицируйте
GetEnumerator()
public IEnumerator GetEnumerator()
{
// Исключение не сгенерируется до тех пор, пока не будет вызван
// метод MoveNext().
throw new Exception("This won't get called");
foreach (Car c in carArray)
{
yield return c;
}
}
Если функция вызывается, как показано далее, и больше ничего не делается, тогда исключение никогда не сгенерируется:
using System.Collections;
...
Console.WriteLine("***** Fun with the Yield Keyword *****\n");
Garage carLot = new Garage();
IEnumerator carEnumerator = carLot.GetEnumerator();
Console.ReadLine();
Код выполнится только после вызова
MoveNext()
GetEnumerator()
Iterator()
- Предыдущая
- 176/642
- Следующая