gpt4 book ai didi

c# - Linq 何时自动调用实现 IEnumerator 的类的 Dispose()?

转载 作者:行者123 更新时间:2023-12-03 08:03:20 26 4
gpt4 key购买 nike

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

我编写的代码引用了 this example .

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

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()叫什么?

最佳答案

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

您可以查看Count here的引用源,你会发现代码片段:

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

return count;

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

当然,如果您通过获取枚举器来使用stringsFound(尽管您很少需要这样做),那么您确实需要记得扔掉它。

var stringsFoundEnumerator = stringsFound.GetEnumerator();
// ^^^^^^ remember to dispose this!

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

关于c# - Linq 何时自动调用实现 IEnumerator<T> 的类的 Dispose()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73201573/

26 4 0