gpt4 book ai didi

c# - 如何在 C# 的 foreach 循环中调用 GetEnumerator 方法?

转载 作者:行者123 更新时间:2023-11-30 16:46:30 28 4
gpt4 key购买 nike

我正在研究迭代器模式,当我偶然发现示例代码中的逻辑时有点困惑

class MonthCollection : IEnumerable
{

public string[] months = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};

public IEnumerator GetEnumerator()
{
// Generates values from the collection
foreach (string element in months)
yield return element;
}
}

static void Main()
{

MonthCollection collection = new MonthCollection();
// Consumes values generated from collection's GetEnumerator method
foreach (string n in collection)
Console.Write(n + " ");
Console.WriteLine("\n");
}

在此代码中,将 Array 访问字符串的正常方法是在 foreach 语句中像这样调用 months 变量

MonthCollection collection = new MonthCollection();
foreach(collection.months 中的字符串 n){}

but i could not understand how is the foreach getting access to the collection without even calling the months variable directly

MonthCollection collection = new MonthCollection();
foreach(集合中的字符串 n){}

更新 1

我无法理解的是,如果不在上面的类中这样调用它,我如何访问变量 months

static void Main()
{

MonthCollection collection = new MonthCollection();
// Consumes values generated from collection's GetEnumerator method
foreach (string n in collection.months)
Console.Write(n + " ");
Console.WriteLine("\n");
}

而不是像这样

 MonthCollection collection = new MonthCollection();
method
foreach (string n in collection)
Console.Write(n + " ");
Console.WriteLine("\n");

最佳答案

foreach 循环不需要集合,它只需要一个带有 GetEnumerator() 方法并返回 IEnumerator 的对象,它在您的案例带有 IEnumerable 实现。

C# 编译器产生剩余的“魔法”——引用枚举器对象的隐藏临时变量、开始枚举的代码、获取每个项目的代码以及查看枚举何时结束的代码。

在您的情况下,C# 依赖于您的实现来使用另一个“魔术”- yield return 构造来获取 months 数组的内容。此构造使您无需为其编写单独的类即可实现 GetEnumerator()。该构造被转换为带有状态机的类,让您从循环中间“返回”对象,然后在从迭代器请求下一个项目时重新回到原来的位置。

yield return 返回的对象不必来自集合。您甚至可以将集合中的对象与其他对象混合,例如

public IEnumerator GetEnumerator() {
// Generates values from the collection
foreach (string element in months) {
yield return element + " will start soon!";
yield return element;
yield return element + " has ended.";
}
}

foreach 循环通过实现 GetEnumerator() 的代码间接访问变量 months

关于c# - 如何在 C# 的 foreach 循环中调用 GetEnumerator 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40328615/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com