public
class
MyResourceHog : IDisposable
{
// 已经被处理过的标记
private
bool
_alreadyDisposed =
false
;
// 终结器。调用虚拟的Dispose方法
~MyResourceHog()
{
Dispose(
false
);
}
// IDisposable的实现
// 调用虚拟的Dispose方法。禁止Finalization(终结操作)
public
void
Dispose()
{
Dispose(
true
);
GC.SuppressFinalize(
true
);
}
// 虚拟的Dispose方法
protected
virtual
void
Dispose(
bool
isDisposing )
{
// 不要多次处理
if
( _alreadyDisposed )
return
;
if
( isDisposing )
{
// TODO: 此处释放受控资源
}
// TODO: 此处释放非受控资源。设置被处理过标记
_alreadyDisposed =
true
;
}
}
如果衍生类需要执行另外的清除操作,它应该实现受保护的Dispose方法:
public
class
DerivedResourceHog : MyResourceHog
{
// 它有自己的被处理过标记
private
bool
_disposed =
false
;
protected
override
void
Dispose(
bool
isDisposing )
{
// 不要多次处理
if
( _disposed )
return
;
if
( isDisposing )
{
// TODO: 此处释放受控资源
}
// TODO: 此处释放所有受控资源
// 让基类释放自己的资源。基类负责调用GC.SuppressFinalize( )
base
.Dispose( isDisposing );
// 设置衍生类的被处理过标记
_disposed =
true
;
}
}