在foreach循环中会发生什么,它输出数组的值?

时间:2013-11-24 14:46:46

标签: c# class foreach iteration ienumerable

我正在学习C和C#,这个问题适用于C#。我有一个类的实例,我使用foreach循环来迭代“string [] days”的值,但是这是怎么发生的?该类有一个GetEnumerator()方法和一个字符串[]天的数组,但该类的实例如何计算字符串的值?

以下是代码:

static void Main()
{ 
    DaysOfTheWeek days = new DaysOfTheWeek();

    foreach (string day in days)
    {
        Console.Write(day + " ");
    }
    // Output: Sun Mon Tue Wed Thu Fri Sat
    Console.ReadKey();
 }

public class DaysOfTheWeek : IEnumerable
{
    private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

    public IEnumerator GetEnumerator()
    {
        for (int index = 0; index < days.Length; index++)
        {
            // Yield each day of the week. 
            yield return days[index];
        }
    }
}

3 个答案:

答案 0 :(得分:1)

foreach循环自动调用 GetEnumerator方法,生成天数(字符串)。

答案 1 :(得分:1)

首先,您不必编写自己的枚举器,因为每个数组(任何类型)都有一个内置的枚举器。所以你会这样做:

public class DaysOfTheWeek : IEnumerable
{
    private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

    foreach(var day in days){
        Console.WriteLine(day);
    }
}

任何实现IEnumerable的类都有一个GetEnumerator()方法,该方法返回一个枚举整个集合的类。编译器使用Enumerator工作流为您转换foreach循环。简而言之,编译器会将您的代码转换为:

private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
var enumerator = days.GetEnumerator();
while(enumerator.MoveNext()){
    Console.WriteLine(enumerator.Current);
}

详细了解枚举器如何处理MSDN文档。

答案 2 :(得分:1)

您的DaysOfTheWeek实现了界面IEnumerable。如果您查看foreach-documentation,您会看到foreach与实现IEnumerable的内容一起工作(从技术上讲,它适用于具有适当GetEnumerator方法的所有内容,请参阅下面的注释)。

当您实现IEnumerable时,您基本上承诺,您还实现了一个名为GetEnumerator的(公共)方法。由于foreach知道此方法存在,它将使用它来迭代/获取字符串值。