托管代码的主要优点之一是内置内存管理。您不需要跟踪指针、缓冲区大小、释放您完成的内存等,托管方面会为您完成这些。
那么为什么我们有一个IDisposable
接口呢? MSDN 说接口是处理非托管资源,如窗口句柄、文件等。但为什么要求我显式调用Dispose
方法(或使用Using
)?
- 为什么当对象超出范围并
Dispose
自动调用时,CLR 不能跟踪?
Public Function DoSomething() As String
Dim reader As New StreamReader("myfile.txt")
Dim txtFromFile As String = reader.ReadToEnd()
Return txtFromFile '<==== reader goes out of scope after this line, so call Dispose automatically
End Function
- 至少,为什么垃圾收集器最终不会找到它并调用
Dispose
?
我错过了什么?
编辑
有几个人(这里和其他建议的答案Using
)建议垃圾收集不够好,因为 GC最终只能收集IDisposable
. 我不明白为什么该论点区分 anIDisposable
和 .NET 中的任何其他对象。在您说IDisposable
对象更占用资源之前,请考虑:
- 上面的MSDN说
IDisposable
适用于非托管对象,无论它们的资源要求如何 - 我见过一些资源非常密集的 .NET 对象(System.Web.UI.Page或System.Data.Objects.ObjectContext怎么样)。