在C#中需要手动清理的资源?

11

C#中有哪些资源需要手动清理?不进行清理会有什么后果?

例如,假设我有以下代码:

myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
// Use Brush

如果我不使用 dispose 方法清除刷子,我是否假定垃圾回收器会在程序终止时释放使用的内存?这个说法正确吗?

还需要哪些资源来手动清理?

14个回答

0

首先,在程序终止时,你可以假设进程使用的内存会随着进程本身的结束而被释放。

在.net中使用dispose或destructor时,必须要了解dispose函数被垃圾回收器调用的时间是不确定的。这就是为什么建议使用using或显式调用dispose的原因。

当使用文件、内存对象(如信号量)和生存在.net托管环境之外的资源时,必须释放这些资源。

例如,SolidBrush需要进行释放,因为它是一个GDI对象且生存在.net环境之外。


0
垃圾回收器不仅在程序终止时释放内存,否则它就不会真正有用(在任何体面/最新的操作系统上,进程退出时,操作系统自动清理所有内存)。
C#相对于C / C ++的最大优点之一是您无需关心释放已分配对象(至少大多数情况下)。垃圾回收器在运行时决定何时/如何进行清理(采用各种策略)。
许多资源不受垃圾回收器管理:文件、线程相关资源(锁)、网络连接等。

0

需要注意的一个地方是那些看起来对GC来说很小但实际上不小的对象... 例如,在SharePoint API中,SPWeb对象在GC方面具有很小的占用空间,因此对于收集来说优先级较低,但它确实占用了大量内存(我相信是在堆中),而GC并不知道。如果您正在使用foreach遍历大量这些对象,那么您将遇到一些有趣的内存问题,因此请始终记得使用using或dispose!


-3

垃圾回收器将处理任何托管资源。在您的示例中,当垃圾回收器决定清理画笔时,它将在最后一次引用画笔不再有效之后的某个时间发生。

有些东西需要手动清理,但这些是从非托管源(例如DLL调用)检索的指针,然而,.NET Framework内部的内容不需要进行此处理。


这个答案的目的是解释何时需要清理资源,而不是其他人所做的应该清理的情况。从原始问题的语气来看,我认为这就是想要的。 - Guvante

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