首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IEnumerator<T>.Current与IEnumerator.Current的关系及IEnumerator<T>实现IDisposable的原因

IEnumerator<T>.Current与IEnumerator.Current的关系及IEnumerator<T>实现IDisposable的原因
EN

Stack Overflow用户
提问于 2011-05-30 09:49:50
回答 2查看 592关注 0票数 2

我正在实现ICollection< T>,而且枚举器的实现也有问题。

我知道IEnumerator< T>必须实现IEnumerator以实现向后兼容性(.NET 1.0)

但是如果我实现的是IEnumerator< T >,那么就有两个当前属性。

我有两个问题:

  1. ,他们应该有什么关系?下面的代码正确吗?

T IEnumerator.Current { get { if (_cursor <0维希_cursor >= _array.Length)抛出新InvalidOperationException("Iterator位置无效“);否则返回_array_cursor;} object IEnumerator.Current { get {返回IEnumerator.Current;}

我得到了以下错误:非静态字段、方法或属性'System.Collections.Generic.IEnumerator.Current.get‘需要一个对象引用。

(2)。为什么IEnumerator< T>必须实现IDisposable。Dispose用于非托管资源,但是在一般情况下枚举器将使用非托管资源吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-30 09:54:56

在一些情况下,IEnumerator<T>IDisposable继承是有用的。

例如,以File.ReadLines()为例,它需要保持打开一个FileStream,这是一个非托管资源。

或者,如果考虑使用yield syntax的迭代器,则需要IDisposable才能使finally子句正确工作:

代码语言:javascript
复制
IEnumerator<int> MyIt()
{
  try
  {
    yield return 1;
  }
  finally
  {
    //Do Something
  }
}

通常,您会像这样实现Current

代码语言:javascript
复制
T Current//Implicit interface implementation
{
  get
  {
    return something;
  }
}

object IEnumerator.Current{get{return Current;}}

您的原始代码无法工作,因为您试图在接口本身上获得一个静态属性。你可能想去((IEnumerator<T>)this).Current。但是,如果您隐式地实现了T Current{...},则根本不需要这种强制转换。

票数 3
EN

Stack Overflow用户

发布于 2011-05-30 09:55:03

  1. return ((IEnumerator<T>)this).Current;
  2. Dispose()用于告诉枚举器不再需要它(例如,您可以从某个数据源断开连接,或者做其他事情)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6174721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档