Nein, darüber brauchen Sie sich keine Sorgen zu machen.
Die Tatsache, dass sie eine IDisposableImplementierung zurückgeben, ist ein Implementierungsdetail. Dies liegt daran, dass Iteratorblöcke in der Microsoft-Implementierung des C # -Compilers zufällig einen einzelnen Typ erstellen, der sowohl IEnumerable<T>als auch implementiert IEnumerator<T>. Letzteres erstreckt sich IDisposable, weshalb Sie es sehen.
Beispielcode, um dies zu demonstrieren:
using System;
using System.Collections.Generic;
public class Test
{
static void Main()
{
IEnumerable<int> foo = Foo();
Console.WriteLine(foo is IDisposable);
}
static IEnumerable<int> Foo()
{
yield break;
}
}
Beachten Sie, dass Sie keine Kenntnis von der Tatsache , dass ergreifen müssen IEnumerator<T>implementiert IDisposable. Jedes Mal, wenn Sie explizit iterieren, sollten Sie es ordnungsgemäß entsorgen. Wenn Sie beispielsweise über etwas iterieren und sicherstellen möchten, dass Sie immer einen Wert haben, können Sie Folgendes verwenden:
using (var enumerator = enumerable.GetEnumerator())
{
if (!enumerator.MoveNext())
{
throw
}
var value = enumerator.Current;
while (enumerator.MoveNext())
{
}
}
(Eine foreachSchleife erledigt dies natürlich automatisch.)