推荐答案
// www.javascriptcn.com code example
public class Resource : IDisposable
{
private bool _disposed = false;
// 实现 IDisposable 接口
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
// 受保护的虚方法,允许子类重写
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// 释放托管资源
}
// 释放非托管资源
_disposed = true;
}
}
// 析构函数
~Resource()
{
Dispose(false);
}
}本题详细解读
Dispose 模式的作用
Dispose 模式主要用于释放非托管资源(如文件句柄、数据库连接等)和托管资源(如集合、对象等)。通过实现 IDisposable 接口,开发者可以显式地释放资源,避免内存泄漏和资源浪费。
Dispose 模式的实现
实现
IDisposable接口:IDisposable接口要求实现Dispose()方法,该方法用于释放资源。Dispose(bool disposing)方法:这是一个受保护的虚方法,允许子类重写。disposing参数用于区分是显式调用Dispose()方法还是通过析构函数调用。- 当
disposing为true时,表示是显式调用Dispose()方法,此时需要释放托管资源和非托管资源。 - 当
disposing为false时,表示是通过析构函数调用,此时只需要释放非托管资源。
- 当
GC.SuppressFinalize(this):在Dispose()方法中调用GC.SuppressFinalize(this),可以防止垃圾回收器调用对象的析构函数,因为资源已经被显式释放。析构函数:析构函数用于在对象被垃圾回收时释放非托管资源。析构函数调用
Dispose(false),确保只释放非托管资源。
使用示例
using (var resource = new Resource())
{
// 使用资源
}在 using 语句块中,Dispose() 方法会在块结束时自动调用,确保资源被正确释放。