我正在学习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];
}
}
}
答案 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
知道此方法存在,它将使用它来迭代/获取字符串值。