CLR如何找到实现IDisposable接口的类?

3

我需要对以下内容进行澄清:

  1. CLR(更具体地说,垃圾回收器)如何找到实现 IDisposable 接口的类;以及

  2. CLR 如何调用实现 IDisposable 接口的所有类的 Dispose 方法以释放内存?


3
我认为你应该更多地了解一下IDisposable,参见https://dev59.com/pXVD5IYBdhLWcg3wVKEb - IDisposable 与释放内存无关,GC也不运行它。另请参见https://dev59.com/83RB5IYBdhLWcg3wEDul。 - Lasse V. Karlsen
@Lasse V. Karlsen:感谢提供的链接。 - Syed
2个回答

4

CLR不会调用Dispose()方法,这需要用户代码直接调用或通过using语句调用。但CLR会调用终结器,但不能保证一定会被调用。


2
CLR可能会调用终结器,但并不保证一定会调用。 - Daniel Hilgarth
在应用程序退出之前,不能保证会调用终结器吗? - koumides
@koumides 应用程序可能会突然结束,例如,在这种情况下,finalizers 可能不会运行。我的答案中的链接提供了详细信息。 - Tim Lloyd

1

Dispose 不会自动调用。当你使用 using 或直接调用 Dispose 时,编译器会生成对 Dispose 的调用。


为什么我们需要实现IDisposable方法,而不是创建任何可以释放资源的方法呢?即使“using”也会扩展为try...finally(),在其中调用Dispose方法。我们也可以在不实现IDisposable接口的情况下做到同样的事情。这个问题的答案将解释接口的必要性。 - Syed
@Syed,我不理解那个评论。 - David Heffernan
从你的回答中我理解的是我们需要显式调用Dispose方法。我的疑问是,那么为什么我们需要实现IDisposable接口然后再实现Dispose方法呢?我们可以直接编写任何其他释放资源的方法。 - Syed
我同意先生的观点,但我想知道我们为什么需要接口。我觉得我有点不明白。即使是 'using' 也会扩展到 try...finally() 块,在 finally 块中调用 Dispose 方法。 - Syed
该设计使用接口,因为这是允许类实现可选功能的自然方式。思考一种替代方案并看看是否能找到更好的? - David Heffernan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接