为什么Enumerable.Range实现IDisposable?

Fow*_*owl 11 .net c# iterator idisposable resource-management

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

我理解为什么IEnumerator<T>,但IEnumerable<T>不要求它.


(我在玩我的.Memoise()实现时发现了这个,它的声明就像

if (enumerable is IDisposable)
    ((IDisposable)enumerable).Dispose();
Run Code Online (Sandbox Code Playgroud)

在它的"源完成"方法中,我因为好奇而放置了一个断点,并且是通过测试触发的.)

Che*_*hen 7

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

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

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

[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() { }
}
Run Code Online (Sandbox Code Playgroud)

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