代码实例
public class BaseResource : IDisposable
{
// 非托管资源
private IntPtr _handle;
//托管资源
private Component _components;
// Dispose是否被调用
private bool _disposed = false;
public BaseResource() { }
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!this._disposed)
{
if (disposing)
{
// 释放托管资源
_components.Dispose();
}
// 释放非托管资源,如果disposing为false, 只有非托管资源被释放
CloseHandle(_handle);
_handle = IntPtr.Zero;
// 注意这里不是线程安全的
}
_disposed = true;
}
// 析构函数只会在我们没有直接调用Dispose方法的时候调用
// 派生类中不用在次提供析构函数
~BaseResource() { Dispose(false); }
// 如果你已经调用了Dispose方法后再调用其他方法会抛出ObjectDisposedException
public void DoSomething()
{
if (this._disposed)
{
throw new ObjectDisposedException();
}
}
}
public class MyResourceWrapper : BaseResource
{
// 托管资源
private ManagedResource _addedManaged;
// 非托管资源
private NativeResource _addedNative;
private bool _disposed = false;
public MyResourceWrapper() { }
protected override void Dispose(bool disposing)
{
if (!this._disposed)
{
try
{
if (disposing)
{
_addedManaged.Dispose();
}
CloseHandle(_addedNative);
this._disposed = true;
}
finally
{
base.Dispose(disposing);
}
}
}
}