Linq 何时自动调用实现 IEnumerator<T> 的类的 Dispose()?

isa*_*go_ 2 c# linq ienumerable ienumerator idisposable

我正在学习IEnumerable<T>并且IEnumerator<T>.

我参考这个例子写了代码。

这是使用它的链接中的示例代码的一部分:

var stringsFound =
    from line in new StreamReaderEnumerable(@"C:\temp\tempFile.txt")
    where line.Contains("string to search for")
    select line;

Console.WriteLine($"Found : {stringsFound.Count()}");
Run Code Online (Sandbox Code Playgroud)

我在这里有一个问题想问你。

StreamReaderEnumerator是系统自动创建的,那么什么时候StreamReaderEnumerator调用呢Dispose()

Swe*_*per 5

您的代码都不会创建负责处理的任何枚举器。像 LINQ 运算符这样的Count设计是为了在内部创建和处理枚举器,因此您根本不必担心它。

Count 您可以在此处查看参考源,然后您将找到片段:

int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
    checked
    {
        while (e.MoveNext())
        {
            count++;
        }
    }
}

return count;
Run Code Online (Sandbox Code Playgroud)

using语句已经为您处理了枚举器 -在返回之前Dispose 调用。Count你没什么可做的。

当然,如果您stringsFound通过获取其枚举器进行消费(尽管您很少需要这样做),那么您确实需要记住处置它。

var stringsFoundEnumerator = stringsFound.GetEnumerator();
//  ^^^^^^ remember to dispose this!
Run Code Online (Sandbox Code Playgroud)

旁注:foreach循环转换while为由语句包装的循环,因此如果您使用循环using进行迭代,则无需担心处置枚举器。:DstringsFoundforeach