推荐答案
// www.javascriptcn.com code example
public class MyResource : IDisposable
{
private bool _disposed = false;
// 实现 IDisposable 接口的 Dispose 方法
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// 受保护的虚方法,允许子类重写
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// 释放托管资源
}
// 释放非托管资源
_disposed = true;
}
}
// 析构函数(Finalizer)
~MyResource()
{
Dispose(false);
}
}本题详细解读
IDisposable 接口的作用
IDisposable 接口用于释放非托管资源。非托管资源是指那些不由 .NET 运行时管理的资源,例如文件句柄、数据库连接、网络套接字等。通过实现 IDisposable 接口,可以确保这些资源在使用完毕后被正确释放,避免内存泄漏。
IDisposable 接口的用法
实现
IDisposable接口:类需要实现IDisposable接口,并提供一个Dispose方法。Dispose方法用于释放资源。Dispose 方法:
Dispose方法通常调用一个受保护的虚方法Dispose(bool disposing),该方法根据disposing参数的值来决定是释放托管资源还是非托管资源。析构函数(Finalizer):析构函数用于在对象被垃圾回收时释放非托管资源。析构函数调用
Dispose(false),确保只释放非托管资源。GC.SuppressFinalize:在
Dispose方法中调用GC.SuppressFinalize(this),以防止垃圾回收器调用析构函数,因为资源已经被显式释放。
使用示例
using (var resource = new MyResource())
{
// 使用资源
}在上述代码中,using 语句确保 MyResource 对象在使用完毕后自动调用 Dispose 方法,释放资源。