foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口
在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnumerator接口,这个接口里定义了Next()等方法,例如:
public class Garge : IEnumerable
{
public IEnumerator GetEnumerator
{
return new A();
} internal class A : IEnumerator
{
//实现Next()等等方法
}
}
假如foreach只需要实现IEnumerator接口,那么我们的类就必须自己实现其接口中的方法,那么常用的集合也要这么实现,那么我们的自定义类要想实现可以用foreach遍历,就必须继承那些常用的集合对象,或是在我们实现IEnumerator接口的方法中,调用集合的对应方法。可以看出,如果.net这样设置,会让人非常的头疼。
而像.net现今这么设计,因为常用的集合对象,通常都实现了IEnumerable接口,我们要在我们自定义的类里实现可以用foreach来遍历,只需要调用集合对象的GetEnumerator()方法即可。
foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口的更多相关文章
- 关于在函数中使用Array.prototype.slice.call而不是直接用slice
arguments是每个函数在运行的时候自动获得的一个近似数组的对象(除了length外没有其他属性),这个arguments对象其实并不是Array,所以没有slice方法. Array.proto ...
- 迭代器学习之一:使用IEnumerable和IEnumerator接口
写博客是检验我学习的成果之一以及自我总结的一种方式,以后会经常利用这种方式进行技术交流和自我总结,其中认识不深难免会有错误,但是一直懂得不懂就问,不懂就学的道理! 1.首先看一个简单的列子 , , , ...
- C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能
1.IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环 ...
- C# 通过IEnumberable接口和IEnumerator接口实现泛型和非泛型自定义集合类型foreach功能
IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如 ...
- C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)
前言 IEnumerable.IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下.以备自己日后可以来翻查,同时也希望园子里 ...
- 细说 C# 中的 IEnumerable和IEnumerator接口
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- C# IEnumerable 和 IEnumerator接口浅析
温故而知新,可以为师矣,有空经常复习一下基础知识是有必要的,并且能加深理解和记忆. Foreach常用于循环访问集合,对实现IEnumerable的接口的容器进行遍历,IEnumerable和IEnu ...
- IEnumerable和IEnumerator接口
我们先思考几个问题:1.为什么在foreach中不能修改item的值?(IEnumerator的Current为只读)2.要实现foreach需要满足什么条件?(实现IEnumerator接口来实现的 ...
- IEnumerable, IEnumerator接口
IEnumerable接口 // Exposes the enumerator, which supports a simple iteration over a non-generic collec ...
随机推荐
- makefile 学习网站
http://blog.csdn.net/ruglcc/article/details/7814546/#t30
- Linux Mint 17使用小结
用过蛮多的linux系统 linux mint是我比较喜欢和常用的一个系统,装的是linux mint xfce 64位版本,在这里记录使用中遇到的一些问题及解决的方法,备忘,方便以后查看. 1.首先 ...
- window 链接方式
一.硬链接 mklink /H <destination> <source> 创建后的图标也和原文件的图标一样,在属性中也无法看出其中的链接关系 可通过命令查看 fsutil ...
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...
- onscroll
var COUNT = 0, demo = document.getElementById('demo'); function testFn() {demo.innerHTML += 'testFN ...
- string类实现(C++)
class CMyString { friend std::ostream& operator<<( std::ostream& os, const CMyString&a ...
- 仓储管理系统500bug记录一下mysql 8小时超时解决办法
HTTP Status 500 - Request processing failed; nested exception is org.springframework.dao.TransientDa ...
- Visor 隐藏应用之一 CSS3 生成器
Visor 有很多隐藏功能,这些功能并不是系统的核心功能,只是为了测试一些技术,做了些对初学前端的工程师还算有用的功能.今天就介绍一下CSS3 生成器. 先介绍一下Note 组件: Note是基本图形 ...
- MicroERP软件更新记录2.1
最新版本:2.1 更新内容:新增客户关系管理(CRM) 下载地址:http://60.2.39.130/microerp 因部分企业用户或个人(开发者)的实际应用水平或技术开发能力参差不齐,且软件开发 ...
- java字符串大小写字母互改
import java.util.Scanner; public class Test { /** * 测试数据 * * @param args */ public static void main( ...