首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现IEnumerator<T>的类的Dispose()何时由Linq自动调用?

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

Stack Overflow用户
提问于 2022-08-02 03:08:09
回答 1查看 62关注 0票数 1

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

我编写了引用这个例子的代码。

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

代码语言:javascript
运行
复制
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是由系统自动创建的,那么什么时候调用StreamReaderEnumeratorDispose()

EN

Stack Overflow用户

回答已采纳

发布于 2022-08-02 03:36:23

您的代码没有创建任何您负责处理的枚举器。像Count这样的LINQ运算符的设计使得它们能够在内部创建和释放枚举数,因此您根本不必担心它。

您可以看到Count 这里的引用源,您可以找到代码片段:

代码语言:javascript
运行
复制
int count = 0;
using (IEnumerator<TSource> e = source.GetEnumerator())
{
    checked
    {
        while (e.MoveNext())
        {
            count++;
        }
    }
}

return count;

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

当然,如果您通过获取它的枚举器来消耗stringsFound (尽管您需要这样做是非常罕见的),那么您确实需要记住将其释放。

代码语言:javascript
运行
复制
var stringsFoundEnumerator = stringsFound.GetEnumerator();
//  ^^^^^^ remember to dispose this!

附带注意:foreach循环转换为由using语句包装的while循环,因此,如果您也使用foreach循环在stringsFound上迭代,则不需要担心处理枚举数。:D

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73201573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档