11

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

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


(我在玩我的 .Memoise() 实现时发现了这一点,它的声明如下

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

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

4

1 回答 1

7

Enumerable.Rangeyield return在其方法体中使用。该yield 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() { }
}

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

于 2012-07-04T03:49:21.197 回答