我正在学习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()}");
我有个问题要问你。
StreamReaderEnumerator
是由系统自动创建的,那么什么时候调用StreamReaderEnumerator
的Dispose()
?
发布于 2022-08-02 03:36:23
您的代码没有创建任何您负责处理的枚举器。像Count
这样的LINQ运算符的设计使得它们能够在内部创建和释放枚举数,因此您根本不必担心它。
您可以看到Count
这里的引用源,您可以找到代码片段:
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
checked
{
while (e.MoveNext())
{
count++;
}
}
}
return count;
using
语句已经为您处理了枚举数- Dispose
被调用,甚至在Count
返回之前。你没什么可做的。
当然,如果您通过获取它的枚举器来消耗stringsFound
(尽管您需要这样做是非常罕见的),那么您确实需要记住将其释放。
var stringsFoundEnumerator = stringsFound.GetEnumerator();
// ^^^^^^ remember to dispose this!
附带注意:foreach
循环转换为由using
语句包装的while
循环,因此,如果您也使用foreach
循环在stringsFound
上迭代,则不需要担心处理枚举数。:D
https://stackoverflow.com/questions/73201573
复制相似问题