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()
。