C#中有哪些资源需要手动清理?不进行清理会有什么后果?
例如,假设我有以下代码:
myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
// Use Brush
如果我不使用 dispose 方法清除刷子,我是否假定垃圾回收器会在程序终止时释放使用的内存?这个说法正确吗?
还需要哪些资源来手动清理?
C#中有哪些资源需要手动清理?不进行清理会有什么后果?
例如,假设我有以下代码:
myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);
// Use Brush
如果我不使用 dispose 方法清除刷子,我是否假定垃圾回收器会在程序终止时释放使用的内存?这个说法正确吗?
还需要哪些资源来手动清理?
首先,在程序终止时,你可以假设进程使用的内存会随着进程本身的结束而被释放。
在.net中使用dispose或destructor时,必须要了解dispose函数被垃圾回收器调用的时间是不确定的。这就是为什么建议使用using或显式调用dispose的原因。
当使用文件、内存对象(如信号量)和生存在.net托管环境之外的资源时,必须释放这些资源。
例如,SolidBrush需要进行释放,因为它是一个GDI对象且生存在.net环境之外。
需要注意的一个地方是那些看起来对GC来说很小但实际上不小的对象... 例如,在SharePoint API中,SPWeb对象在GC方面具有很小的占用空间,因此对于收集来说优先级较低,但它确实占用了大量内存(我相信是在堆中),而GC并不知道。如果您正在使用foreach遍历大量这些对象,那么您将遇到一些有趣的内存问题,因此请始终记得使用using或dispose!
垃圾回收器将处理任何托管资源。在您的示例中,当垃圾回收器决定清理画笔时,它将在最后一次引用画笔不再有效之后的某个时间发生。
有些东西需要手动清理,但这些是从非托管源(例如DLL调用)检索的指针,然而,.NET Framework内部的内容不需要进行此处理。