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()?
您的代码都不会创建您负责处理的任何枚举器。像 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