** 能用 foreach 遍历访问的对象需要实现 什么 接口或声明 什么 方法**
要使用 foreach
循环,对象必须实现 I Enumerable
接口或者声明 Get Enumerator
方法。
解释
-
IEnumerable 接口:这个接口定义了一个名为
GetEnumerator
的方法,该方法返回一个枚举器,允许客户端代码逐个访问集合中的元素。 -
GetEnumerator 方法:这是
IEnumerable
接口中定义的方法。实现IEnumerable
接口的类必须提供这个方法。此外,如果你不想实现整个IEnumerable
接口,也可以直接在你的类中声明GetEnumerator
方法,但通常这样做不如实现IEnumerable
接口常见。
代码示例
实现 IEnumerable
接口
using System;
using System.Collections;
using System.Collections.Generic;
public class MyCollection : IEnumerable
{
private List<int> items = new List<int>();
public MyCollection()
{
for (int i = 0; i < 5; i++)
{
items.Add(i);
}
}
public IEnumerator GetEnumerator()
{
return items.GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
MyCollection collection = new MyCollection();
// 使用 foreach 遍历 MyCollection
foreach (var item in collection)
{
Console.WriteLine(item);
}
}
}
在这个例子中,MyCollection
类实现了 IEnumerable
接口,并提供了 GetEnumerator
方法,使得我们可以在 Main
方法中使用 foreach
循环来遍历 MyCollection
对象。
声明 GetEnumerator
方法
虽然较少见,但在某些情况下,你可以直接声明 GetEnumerator
方法,而不是实现整个 IEnumerable
接口。这可以通过显式实现 IEnumerable.GetEnumerator
方法来完成,但通常这种方式不推荐使用,因为这样会使得调用者无法直接通过对象调用 GetEnumerator
方法。
using System;
using System.Collections;
using System.Collections.Generic;
public class MyCollection
{
private List<int> items = new List<int>();
public MyCollection()
{
for (int i = 0; i < 5; i++)
{
items.Add(i);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return items.GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
MyCollection collection = new MyCollection();
// 使用 foreach 遍历 MyCollection
foreach (var item in collection)
{
Console.WriteLine(item);
}
}
}
在这个例子中,MyCollection
类没有实现 IEnumerable
接口,而是显式实现了 IEnumerable.GetEnumerator
方法。尽管如此,由于 GetEnumerator
方法的存在,我们仍然可以使用 foreach
循环来遍历 MyCollection
对象。
总结
- 实现
IEnumerable
接口是最常见的做法,它确保了GetEnumerator
方法的可用性。 - 直接声明
GetEnumerator
方法也可以支持foreach
循环,但这不是最佳实践。