Non, vous n'avez pas besoin de vous inquiéter à ce sujet.
Le fait qu'ils rendent l' IDisposable
mise en œuvre est un détail d'implémentation - c'est que l'itérateur de blocages dans la mise en œuvre de Microsoft de le compilateur C# arriver à créer un seul type qui implémente les deux IEnumerable<T>
et IEnumerator<T>
. Ce dernier s'étend IDisposable
, ce qui est pourquoi vous voyez.
Exemple de code pour illustrer ceci:
using System;
using System.Collections.Generic;
public class Test
{
static void Main()
{
IEnumerable<int> foo = Foo();
Console.WriteLine(foo is IDisposable); // Prints True
}
static IEnumerable<int> Foo()
{
yield break;
}
}
Notez que vous ne devez prendre note du fait que l' IEnumerator<T>
implémente IDisposable
. Donc, à tout moment vous parcourez explicitement, vous devriez vous en débarrasser de manière appropriée. Par exemple, si vous souhaitez effectuer une itération sur quelque chose et d'être sûr que vous aurez toujours une valeur, vous pouvez utiliser quelque chose comme:
using (var enumerator = enumerable.GetEnumerator())
{
if (!enumerator.MoveNext())
{
throw // some kind of exception;
}
var value = enumerator.Current;
while (enumerator.MoveNext())
{
// Do something with value and enumerator.Current
}
}
( foreach
Boucle se faire automatiquement cela, bien sûr.)