使用一次性模式清理IDispose成员类
本文关键字:IDispose 成员类 模式 一次性 | 更新日期: 2023-09-27 18:07:02
一次性模式的一部分包括以下方法:
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// TODO: dispose managed state (managed objects).
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposed = true;
}
}
此方法有不同的处理方式来清理托管和非托管资源。但是如果我想清理一个实现IDisposable
的类成员呢?
通常,我不知道该成员是清理托管资源还是非托管资源。因此,如果我想要我的Dispose
方法来清理实现IDisposable
的类成员,我会在上面代码中的托管或非托管部分中对该成员调用Dispose()
吗?
您应该在托管部分调用Dispose(即,仅当disposing
为true时)。
架构设计指引下处置模式的部分指引是:
布尔参数dispose指示是否从IDisposable调用该方法。从终结器中释放实现或。Dispose(bool)实现应该在访问其他引用对象之前检查参数[…]。只有在从IDisposable调用方法时才能访问这样的对象。Dispose实现(当Dispose参数等于true时)。如果从终结器调用该方法(处置为false),则不应访问其他对象。原因是对象是以不可预测的顺序完成的,因此它们或它们的任何依赖项可能已经完成了。
另一个有用的资源是实现Dispose方法
处理实现IDisposable
的类成员的标准方法如下:
public class Foo : IDisposable
{
// MemoryStream implements IDisposable
private readonly Stream _stream = new MemoryStream();
private bool _disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
_stream.Dispose();
}
_disposed = true;
}
}
为了澄清,清理管理的资源意味着资源本身实现了IDisposable
(就像上面的MemoryStream
一样)。MemoryStream
/Stream
保存底层的非托管资源,并且它的清理逻辑已经为您实现了。不需要清理Foo
中未管理的资源。