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
包含非託管資源的類型,您可能會得到不同的編譯結果。 (不確定)
http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx –