为什么Enumerable.Range实现IDisposable



只是想知道为什么Enumerable.Range实现IDisposable .

我理解IEnumerator<T>为什么这样做,但IEnumerable<T>不需要它。


(我在玩我的.Memoise() 实现,它有类似

if (enumerable is IDisposable)
    ((IDisposable)enumerable).Dispose();

在它的"源完成"方法中,我出于好奇而放置了一个断点,并由测试触发。

Enumerable.Range在其方法主体中使用yield returnyield return语句生成一个匿名类型,该类型在编译器的魔力下实现IDisposable,如下所示:

static IEnumerable<int> GetNumbers()
{
    for (int i = 1; i < 10; i += 2)
    {
        yield return i;
    }
}

编译后,有一个匿名嵌套类,如下所示:

[CompilerGenerated]
private sealed class <GetNumbers>d__0 
   : IEnumerable<int>, IEnumerable, IEnumerator<int>, IEnumerator, IDisposable
{
    //the implementation
    //note the interface is implemented explicitly
    void IDisposable.Dispose() { }
}

所以结果is IDisposable.在此示例中,Dispose方法留空。我认为原因是没有必要处理。如果yield return包含非托管资源的类型,则可能会获得不同的编译结果。(不确定)

相关内容

  • 没有找到相关文章

最新更新