1 接口IEnumerator,IEnumerable区别
IEnumerable是一个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如 何实现迭代器(iterator).其代码实现为:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
而IEnumerator接口是实现式接口,它声明实现该接口的类就可以作为一个迭代器iterator.其代码实现为:
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
所以一个collection要支持Foreach进行遍历,就必须实现IEnumerable,并一某种方式返回迭代器对象:IEnumerator
2 IEnumerable,IEnumerable<T>区别
我们可以看一段代码:
public interface IEnumerable<out T>:IEnumerable
{
IEnumerator<T> GetEnumerator();
}
从上面代码可以很清楚知道IEnumerable<T>是IEnumerable接口的泛型版本。
使用泛型,不会强行对值类型进行装箱和拆箱,或引用类型进行向下强制类型转换,使程序性能提高。泛型定义的变量有类型限制,所以泛型提高了程序的类型安全并且提高了代码的重用性。
比如我们常见的IList
IList<T>继承自ICollection<T>,
ICollection<T>继承自IEnumerable<T>,
IEnumerable<T>继承自IEnumerable,
所以List<T>实现了IEnumerable<T>接口,也就是实现了IEnumerable接口
所以可以经常看到这样的代码 :
public static IEnumerable<T> Filter<T>(IEnumerable<T> ObjectList)
{
List<T> ResultList = new List<T>();
..............
return ResultList;
}