对于应用创建的大多数对象,可以依赖 .NET 垃圾回收器 来处理内存管理。 但是,创建包含非托管资源的对象时, 必须在 使用完这些资源时显式释放这些资源。 最常见的非托管资源类型是包装作系统资源的对象,例如文件、窗口、网络连接或数据库连接。 尽管垃圾回收器能够跟踪封装非托管资源的对象生存期,但它不知道如何释放和清理非托管资源。
如果您的类型使用非托管资源,则应执行以下操作:
实现清理模式。 这要求你提供 IDisposable.Dispose 实现以启用非托管资源的确定性释放。 当不再需要对象(及其使用的资源)时,你的类型的使用者将调用 Dispose 。 Dispose 方法立即释放非托管资源。
在类型使用者忘记调用 Dispose 的情况下,请提供一种方法来释放非托管资源。 可以通过两种方式来执行此操作:
使用安全句柄包装非托管资源。 这是建议的技术。 安全句柄派生自 System.Runtime.InteropServices.SafeHandle 抽象类,并包含可靠的 Finalize 方法。 使用安全句柄时,只需实现IDisposable接口,然后在Dispose实现中调用安全句柄的IDisposable.Dispose方法。 如果未调用安全句柄的 Dispose 方法,则垃圾回收器将自动调用安全句柄的终结器。
— 或 —
定义 终结器。 当类型使用者无法调用 IDisposable.Dispose 以确定性地释放非托管资源时,终止会启用对非托管资源的非确定性释放。
警告
对象终止是一项复杂且易出错的操作,建议你使用安全句柄而不是提供你自己的终结器。
然后,类型使用者可直接调用 IDisposable.Dispose 实现以释放非托管资源使用的内存。 在正确实现 Dispose 方法时,安全句柄的 Finalize 方法或 Object.Finalize 方法的重写会在未调用 Dispose 方法的情况下阻止清理资源。
本部分内容
实现 Dispose 方法 介绍了如何实现释放模式以释放非托管资源。
使用实现IDisposable
的对象描述类型的使用者如何确保调用其Dispose实现。 强烈建议使用 C# using
(或 Visual Basic Using
) 语句执行此作。
参考文献
类型/成员 | DESCRIPTION |
---|---|
System.IDisposable | 定义用于释放非托管资源的 Dispose 方法。 |
Object.Finalize | 如果 Dispose 方法未释放非托管资源,则准备对象终止。 |
GC.SuppressFinalize | 取消终止。 此方法通常从 Dispose 方法调用,以防止终结器执行。 |