日期:2014-05-17  浏览次数:20936 次

IEnumerable接口和IEnumerable<T> 接口
一直对IEnumerable接口和IEnumerable<T>接口雾里看花,我目前的认识是,只要是能用foreach遍历的集合,都实现了IEnumerable,实现了IEnumerable接口的对象,实际上就是指的一个集合。


问题:
1:List<int>实现了IEnumerable接口吗?

2:IEnumerable<T>是IEnumerable接口的泛型版本?是泛型版本又怎么样,不是泛型版本又怎么样呢,二者有什么区别呢?

3:实现了IEnumerable接口和实现了IEnumerable<T>接口有什么不同呢?

------解决方案--------------------
1.是,可以通过右键转到定义或F12查看类型定义
2.泛型版本是强类型(类型安全)的,并且IEnumerable<T>实现了IEnumerable
也就是说,所有IEnumerable的功能,IEnumerable<T>都具备
在写代码时会带来很多方便
3.IEnumerable是用foreach遍历充要条件,简单例子
IEnumerable<string> iEnumerable = new string[]{ };
IEnumerable enumerable = iEnumerable;
但是,如果你不知道enumerable中元素是string类型,你就只能当作object使用
foreach(object obj in enumerable)
foreach(string str in iEnumerable)  可以进一步使用str的方法和属性
虽然,你的确可以写成foreach(string obj in enumerable),但是前提是你得事先知道obj的实际类型才行

例子中只是用了基础类型string,如果是一个复杂类型,使用IEnumerable将会很不方便,频繁的类型转换不仅影响性能而且容易出错
如果使用泛型,就算不小心写错了类型,编译器都可以划红线提示你,大大提高了程序的可靠性。
强类型和弱类型显著的区别
http://www.cnblogs.com/mxyu/archive/2012/05/03/2480535.html

------解决方案--------------------
问题1:IList<T>继承自ICollection<T>,
       ICollection<T>继承自IEnumerable<T>,
       IEnumerable<T>继承自IEnumerable,
       所以List<T>实现了IList<T>接口,也就是实现了IEnumerable接口
问题2:IEnumerable<T>是IEnumerable接口的泛型版本。使用泛型,不会强行对值类型进行装箱和拆箱,
       或引用类型进行向下强制类型转换,使程序性能提高。泛型定义的变量有类型限制,所以泛型提
       高了程序的类型安全。  泛型还提高了代码的重用性。
问题3:不同就是问题2的区别。