我需要考虑处置任何IEnumerable <T>我使用?

最近有人向我指出,各种Linq扩展方法(如WhereSelect等)都返回一个IEnumerable<T> ,也恰好是IDisposable 。 以下评估为True

 new int[2] {0,1}.Select(x => x*2) is IDisposable 

我是否需要处理Whereexpression式的结果?

每当我调用一个方法返回IEnumerable<T> ,我(可能)接受负责调用处理,当我完成了它?

不,你不需要担心这个。

他们返回一个IDisposable实现的事实是一个实现细节 – 这是因为C#编译器的Microsoft实现中的迭代器块碰巧创build了一个实现IEnumerable<T>IEnumerator<T>单一types。 后者扩展IDisposable ,这就是为什么你看到它。

示例代码来演示这一点:

 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; } } 

请注意,您需要注意IEnumerator<T>实现IDisposable的事实。 所以任何时候你明确地迭代,你应该正确地处理它。 例如,如果你想迭代一些东西,并确保你总是有一个值,你可以使用如下的东西:

 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循环会自动执行此操作。)