关于C#中IEnumerable实现方式的困惑与技术疑问
关于C# IEnumerable实现的常见疑问解答
整理的学习资料
- 资料1:若类实现
IEnumerable,需实现IEnumerator,后者要实现MoveNext、Reset方法,示例为Product类实现IEnumerable并返回自定义枚举器实例。 - 资料2:可直接使用合法代码,
Product类中定义返回IEnumerable<Product>的GetProducts方法,返回List<Product>实例。 - 资料3:一种
GetEnumerator方法实现语法:IEnumerator IEnumerable.GetEnumerator(),返回转换后的GetEnumerator结果。
我的疑问
- 为何资料2的
Product类未用接口声明语法(如public class Product:IEnumerable)? - 为何资料2无需实现
IEnumerator? - 资料3的语法含义是什么?是声明方法吗?为何不符合常规方法声明语法?
疑问解答
1. 为何资料2的Product类未用接口声明语法?
资料2里的Product类并没有要自己成为可枚举对象,它只是提供了一个方法,返回的是已经实现IEnumerable<Product>的List<Product>实例。换句话说,可枚举的是方法返回的List,而非Product类本身,所以根本不需要让Product类去实现IEnumerable接口。调用方只需要遍历GetProducts返回的List就行,和Product类本身是否实现接口没关系。
2. 为何资料2无需实现IEnumerator?
枚举器是给可枚举对象用的,资料2里真正被遍历的是List<Product>,而List<T>内部已经完整实现了IEnumerator<T>的所有逻辑(包括MoveNext、Current这些必要成员),不需要你在Product类里重复造轮子。你只需要返回这个现成的可枚举对象,剩下的枚举工作List自己就能搞定。
3. 资料3的语法含义是什么?
这是C#里的显式接口实现语法,本质就是在实现IEnumerable接口要求的GetEnumerator方法,只是写法特殊。
常规的接口方法实现是把方法声明为公共成员,比如public IEnumerator GetEnumerator(),但显式实现时必须把接口名写在方法名前面,格式就是[返回值] [接口名].[方法名]()。这么做的目的通常是:
- 避免类自身的方法和接口方法重名冲突;
- 隐藏这个接口方法,只有当把类实例转换成
IEnumerable接口类型时,才能调用它,不会污染类的公共成员列表。
这种写法完全符合C#语法规范,并不是“不符合常规”,只是一种特殊的接口实现方式。
内容的提问来源于stack exchange,提问作者oli
相关产品推荐
相关产品推荐

