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)
在它的"源完成"方法中,我因为好奇而放置了一个断点,并且是通过测试触发的.)
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是包含非托管资源的类型,则可能会获得不同的编译结果.(不确定)