IEnumerator和IEnumerable区别
2011-07-21 10:27
399 查看
这两个接口字面上很相似,其实也有一定的关联。
一个类A实现了IEnumerator,也就是实现Current属性,MoveNext方法,Reset方法。只要实现这些方法,这个类A就可以用foreach这种语法了。
IEnumerable接口主要实现了GetEnumerator方法,该方法返回一个IEnumerator。一个类A实现IEnumerable接口后,调用foreach语法的时候,会自动的调用GetEnumerator方法,然后在这个IEnumerator中遍历。
所以只要实现两者之中任意一个接口,就可以用foreach语法了。但是本质上都是对IEnumerator做foreach,只是一个是直接,一个是间接。
代码说明:比如类baz,实现了IEnumerable,那么下面的代码
foreach (Foo bar in baz)
{
...
}
说明代码就功能上等同于下面的代码
IEnumerator bat = baz.GetEnumerator();
while (bat.MoveNext())
{
bar = (Foo)bat.Current()
...
}
---------------------
如果一个类,同时实现了IEnumerator<T>,IEnumerable<T>,那么就是糟糕的设计
因为用foreach语法的时候,会先调用IEnumerable的GetEnumerator方法。这是经过测试的。
测试代码如下:
class Class1 : IEnumerator<string>,IEnumerable<string>
{
public int count = 0;
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
return null;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return null;
}
///////////////////////////////////////////
string IEnumerator<string>.Current
{
get { return DateTime.Now.ToString(); }
}
void IDisposable.Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get { return DateTime.Now; }
}
bool System.Collections.IEnumerator.MoveNext()
{
if (count < 10)
{
count++;
return true;
}
else
{
return false;
}
}
void System.Collections.IEnumerator.Reset()
{
count=0;
}
}
---------------main.cs---------
Class1 c = new Class1();
foreach (var i in c)
{
Console.WriteLine(i);
}
一个类A实现了IEnumerator,也就是实现Current属性,MoveNext方法,Reset方法。只要实现这些方法,这个类A就可以用foreach这种语法了。
IEnumerable接口主要实现了GetEnumerator方法,该方法返回一个IEnumerator。一个类A实现IEnumerable接口后,调用foreach语法的时候,会自动的调用GetEnumerator方法,然后在这个IEnumerator中遍历。
所以只要实现两者之中任意一个接口,就可以用foreach语法了。但是本质上都是对IEnumerator做foreach,只是一个是直接,一个是间接。
代码说明:比如类baz,实现了IEnumerable,那么下面的代码
foreach (Foo bar in baz)
{
...
}
说明代码就功能上等同于下面的代码
IEnumerator bat = baz.GetEnumerator();
while (bat.MoveNext())
{
bar = (Foo)bat.Current()
...
}
---------------------
如果一个类,同时实现了IEnumerator<T>,IEnumerable<T>,那么就是糟糕的设计
因为用foreach语法的时候,会先调用IEnumerable的GetEnumerator方法。这是经过测试的。
测试代码如下:
class Class1 : IEnumerator<string>,IEnumerable<string>
{
public int count = 0;
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
return null;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return null;
}
///////////////////////////////////////////
string IEnumerator<string>.Current
{
get { return DateTime.Now.ToString(); }
}
void IDisposable.Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get { return DateTime.Now; }
}
bool System.Collections.IEnumerator.MoveNext()
{
if (count < 10)
{
count++;
return true;
}
else
{
return false;
}
}
void System.Collections.IEnumerator.Reset()
{
count=0;
}
}
---------------main.cs---------
Class1 c = new Class1();
foreach (var i in c)
{
Console.WriteLine(i);
}
相关文章推荐
- IEnumerable、IEnumerator、List、ArrayList、[]数组各各的区别
- IEnumerator与IEnumerable接口区别
- IEnumerable和IEnumerator区别
- IEnumerable与IEnumerator区别
- IEnumerable与IEnumerator区别(带实例)
- IEnumerator和IEnumerable的区别
- IEnumerable与IEnumerator区别
- IEnumerable和IEnumerator区别有哪些
- IEnumerable和 IEnumerator的区别
- IEnumerator和IEnumerable区别
- C#中IEnumerable和IEnumerator区别
- IEnumerable和IEnumerator的区别
- IEnumerable和IEnumerator的区别
- IEnumerable和IEnumerator介绍和区别
- IEnumerator和IEnumerable区别
- 转载:IEnumerable和IEnumerator有什么区别?
- IEnumerable与IEnumerator区别
- IEnumerable与IEnumerator区别
- IEnumerable和IEnumerator有什么区别 (摘自BaiDu知道)
- IEnumerable、GetEnumerator、IEnumerator之间的区别