【问题标题】:Relation between IEnumerator<T>.Current and IEnumerator.Current and Why IEnumerator<T> implements IDisposableIEnumerator<T>.Current 和 IEnumerator.Current 之间的关系以及为什么 IEnumerator<T> 实现 IDisposable
【发布时间】:2011-05-30 09:49:50
【问题描述】:

我正在实现 ICollection,但在实现枚举器时出现问题。

我了解 IEnumerator 必须实现 IEnumerator 以实现向后兼容 (.NET 1.0)

但如果我正在实现 IEnumerator,那么有 2 个当前属性。

我有两个问题:

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

    T IEnumerator<T>.Current 
    { 
        get 
        {
            if (_cursor < 0 || _cursor >= _array.Length)
                throw new InvalidOperationException("Iterator position invalid");
            else 
                return _array[_cursor];
        } 
    }
    
    
    object IEnumerator.Current
    {
        get
        {
            return IEnumerator<T>.Current;
        }
    }
    

我收到此错误:非静态字段、方法或属性“System.Collections.Generic.IEnumerator.Current.get”需要对象引用

(2)。为什么 IEnumerator 必须实现 IDisposable。 Dispose 用于非托管资源,但一般情况下 Enumerator 会在什么情况下使用非托管资源?

【问题讨论】:

  • 第二个问题是这个one的副本。

标签: .net generics collections


【解决方案1】:

IEnumerator&lt;T&gt; 继承自 IDisposable 在某些情况下很有用。

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

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

IEnumerator<int> MyIt()
{
  try
  {
    yield return 1;
  }
  finally
  {
    //Do Something
  }
}

通常你会像这样实现Current

T Current//Implicit interface implementation
{
  get
  {
    return something;
  }
}

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

您的原始代码不起作用,因为您尝试获取接口本身的静态属性。你可能想((IEnumerator&lt;T&gt;)this).Current。但是,如果您隐式实现 T Current{...},则根本不需要该演员表。

【讨论】:

  • 我做了对象 IEnumerator.Current { get { return (IEnumerator)this.Current; } } 但它再次出现编译错误,说找不到 Current 的定义。
  • . 的优先级高于强制转换。注意我的代码中多余的括号。
  • 现在可以使用了。关于处置的 1 个问题。编译器需要 Dispose 为 public Dispose,为什么?接口方法不需要任何访问修饰符,对吧?对于 MoveNext,Reset 我不得不删除 public,因为编译器如此抱怨。
  • 如果您将其设为隐式实现接口的普通方法,则需要将其公开。如果您要明确实现接口,则无法手动指定可见性,因为该接口已经确定了可见性。
【解决方案2】:
  1. return ((IEnumerator&lt;T&gt;)this).Current;

  2. Dispose() 用于告诉枚举器不再需要它(例如,您可以断开与某些数据源的连接,或执行其他操作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2014-01-09
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多