C# LINQ IEnumerable扩展是否对其IEnumerable调用Dispose?

C# LINQ IEnumerable扩展是否对其IEnumerable调用Dispose?,c#,.net,linq,C#,.net,Linq,假设我编写了一个类,它实现了IEnumerable,并返回了一个IEnumerator,它不仅是作为一个枚举器的IDisposable,而且在完成枚举后,它还管理了需要Dispose()的资源,那么我可以相信下面的内容将Dispose()只要我的枚举器在其IDisposable实现中正确地处理这些托管资源,这些托管资源是什么 return (new MyClass()).Select(x => x); 编辑:这个问题似乎与标记为相似的mods相似,但在我看来,它的语义不同(我在提出问题之

假设我编写了一个类,它实现了
IEnumerable
,并返回了一个
IEnumerator
,它不仅是作为一个枚举器的
IDisposable
,而且在完成枚举后,它还管理了需要
Dispose()
的资源,那么我可以相信下面的内容将
Dispose()
只要我的枚举器在其
IDisposable
实现中正确地处理这些托管资源,这些托管资源是什么

return (new MyClass()).Select(x => x);

编辑:这个问题似乎与标记为相似的mods相似,但在我看来,它的语义不同(我在提出问题之前看到过)

是的,您可以从LINQ方法内部依赖对迭代器的调用
Dispose()

在Microsoft发布的中,迭代器的使用分为三类:

  • 迭代器是从
    foreach
    循环中使用的,它确保调用
    Dispose()
    ,或
  • 迭代器与
    while
    循环结合使用;这些迭代器被显式地释放
  • 迭代器是使用块在
    内部获得的,这确保了自动处理

在所有这些情况下,库确保迭代器的
Dispose()
方法在完成时被调用。

您不必像John Skeet回答的那样谈论Dispose…[Link][1][1]:如果您想确定,您可以始终在
Dispose()中放置
Console.WriteLine()
并查看它是否被触发。如果他的
MyClass
实现了
IDisposable
则会调用
Dispose()
方法。垃圾收集器不是调用
Dispose()
@MattRowland的垃圾收集器-关于
MyClass
,这是不对的。在OP的代码中,
不会对
新MyClass()调用Dispose
。我不是说它会。我是说,他可以通过在
Dispose()
方法中放置
Console.WriteLine()
来检查是否会这样做。因此,只有在
foreach
的情况下,Dispose才会自动“在枚举时”调用?@user2864740 Yes。如果您在
中手动使用
迭代器
,则应自己调用
Dispose()