使用一次性模式清理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()吗?

使用一次性模式清理IDispose成员类

您应该在托管部分调用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未管理的资源。