EMP*_*EMP 11
通常,a IEnumerable
是可以枚举的对象,例如列表或数组.An IEnumerator
是存储枚举状态的对象.
它们不是同一个的原因是你可以同时在同一个对象上有多个枚举 - 即使在单线程应用程序中也是如此.例如,请考虑以下代码:
foreach (x in mylist)
{
foreach (y in mylist)
{
if (x.Value == y.Value && x != y)
{
// Found a duplicate value
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果mylist
是正确的实现,这将工作正常IEnumerable
,但如果mylist
作为枚举器返回它将失败.
Pau*_*ner 10
该IEnumerable
接口定义了可在被枚举,即,其包含能够通过枚举被访问元素的类.
该IEnumerator
接口定义了可以在元素的序列执行枚举的类.
区别在于IEnumerable
"你可以枚举我",IEnumerator
执行枚举任务.
为了详细说明,IEnumerable
公开了一种方法GetEnumerator
.此方法返回一个IEnumerator
您可以用来执行枚举的方法.通常,您自己不会处理此方法,因为foreach
关键字会为您处理.
foreach(int element in myList)
{
// Do some work...
}
Run Code Online (Sandbox Code Playgroud)
这段代码实际上是由编译器为您扩展的:
IEnumerator enumerator = myList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = (int)enumerator.Current;
// Do some work...
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,IEnumerator
此处使用an 来执行元素的枚举.
归档时间: |
|
查看次数: |
752 次 |
最近记录: |