只是想知道为什么Enumerable.Range
实现IDisposable
.
我明白为什么IEnumerator<T>
这样做,但IEnumerable<T>
不需要它。
(我在玩我的 .Memoise() 实现时发现了这一点,它的声明如下
if (enumerable is IDisposable)
((IDisposable)enumerable).Dispose();
在它的“源代码完成”方法中,我出于好奇放置了一个断点,并由测试触发。)
只是想知道为什么Enumerable.Range
实现IDisposable
.
我明白为什么IEnumerator<T>
这样做,但IEnumerable<T>
不需要它。
(我在玩我的 .Memoise() 实现时发现了这一点,它的声明如下
if (enumerable is IDisposable)
((IDisposable)enumerable).Dispose();
在它的“源代码完成”方法中,我出于好奇放置了一个断点,并由测试触发。)
Enumerable.Range
yield 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() { }
}
所以结果is
a IDisposable
。在此示例中,该Dispose
方法留空。我认为原因是没有什么需要处理的。如果您yield return
的类型包含非托管资源,您可能会得到不同的编译结果。(不确定)