只是想知道为什么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
IDisposable
.在此示例中,Dispose
方法留空。我认为原因是没有必要处理。如果yield return
包含非托管资源的类型,则可能会获得不同的编译结果。(不确定)