【发布时间】:2013-11-22 13:15:23
【问题描述】:
好吧,我正在尝试理解可以通过代码显式完成的内存过程的释放。
我在下面的 MS 线程中看到 Dispose 方法是在 Component 类中实现的。在这里,我有三个疑问。
Component 类派生自 IDisposable,但是,在这个类库中,我发现它没有实现方法 Dispose,甚至看起来都不是“public void Dispose() { }”。但是当我只是编写一个类并声明一个没有任何主体的方法时,它会给我编译时错误说,我应该定义主体或使其抽象。为什么会有这种差异?
我一般用这种方式,比如“connection.Dispose();”在 finally 块中处理 sqlconnection。我知道,SqlConnection 是从 DBConnection 派生的,而 DBConnection 又是从 Component 派生的。当我查看 Component 类时,我只看到方法“public void Dispose();”的声明那么具体在哪里实现呢?
我还看到了一些专门实现的代码,类似于下面 MS 网站中给出的代码。他们为 Dispose 状态声明了一个 bool 变量,并有一个新的 Dispose 方法,他们在其中调用对象上的 Component Dispose。他们还对非托管资源使用 Kernel32 方法 CloseHandle。这种方法有什么用?在处理它时,我从未将它用于我的 SqlConnection (这也是一个非托管资源)。
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize(v=vs.110).aspx
谁能帮我简单理解一下上面的三个问题。我只是在学习所有这些。谢谢
【问题讨论】:
-
Fwiw,Dispose() NOTHING 与内存有关。
-
@JoelCoehoorn:处理非托管和托管资源并回收内存是我学到的。 MS 网站说“实现 IDisposable 接口的对象可以从 IDisposable.Dispose 方法调用此方法,以防止垃圾收集器在不需要它的对象上调用 Object.Finalize。”
-
你在哪里看到
Component没有实现Disponse?文档清楚地表明确实如此。 msdn.microsoft.com/en-us/library/… -
那你学错了。垃圾收集器负责从对象中清理内存,即使您释放了它。
-
您只是对 IDE 向您显示有关 .NET 框架中的类(如组件)的信息的方式感到困惑。它没有向您显示源代码,您没有所有 .NET 框架类的源代码。微软有它。它只是向您显示类的“大纲”,只是声明。您在对象浏览器中看到的相同。您自己不会那样编写 C# 代码。其他任何关于 .NET 框架的中间书籍都很好地涵盖了您的问题。
标签: c# .net c#-4.0 interface garbage-collection