对从Stream派生的类实现Dispose

时间:2010-04-26 12:00:29

标签: c# .net stream idisposable

我正在构建一个派生自Stream的类来包装COM IStream。但是我遇到了一个问题,我需要确定地释放COM IStream。

好的,只需在Marshal.ReleaseComObject方法中使用Dispose即可。但是我不确定那么简单。 Stream基类已经有一个受保护的虚方法Dispose(boolean)。这是我的第一个想法: -

    ~ComStreamWrapper()
    {
        if (!_Disposed)
        {
            iop.Marshal.FreeCoTaskMem(_Int64Ptr);
            iop.Marshal.ReleaseComObject(_IStream);
        }
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        if (!_Disposed)
        {
            if (disposing)
            {
                iop.Marshal.FreeCoTaskMem(_Int64Ptr);
                iop.Marshal.ReleaseComObject(_IStream);
            }
            _Disposed = true;
        }
    }

您会注意到Dispose()本身没有实现。我目前正在假设Stream上的现有实施完成了我需要的工作。这是致电Diposing(true)GC.SuppressFinalize。这个假设是错误的吗?

我错过了什么吗?有更好的方法吗?您可以在此answer中看到更多基本类的问题。

3 个答案:

答案 0 :(得分:3)

重写Disposing方法并从终结器中调用它将完成工作。请注意,您希望在两种情况下都释放资源。因此:

~ComStreamWrapper()
{
    Dispose(false);
}

protected override void Dispose(bool disposing)
{
    base.Dispose(disposing);
    if (!_Disposed)
    {
        iop.Marshal.FreeCoTaskMem(_Int64Ptr);
        iop.Marshal.ReleaseComObject(_IStream);
        _Disposed = true;
    }
}

答案 1 :(得分:2)

  

我目前正在做出假设   那个现有的实现   Stream做我需要的东西。那是   调用Diposing(true)和   GC.SuppressFinalize。这是   假设有错?

这正是它的作用。好吧,它调用Close,即:

public virtual void Close()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

当你想要对某些标准类真正做的事情做出明确答案时的一般提示,在Reflector中打开它并查看它的C#反汇编。

答案 2 :(得分:0)

此配置方法:

  protected virtual void Dispose(bool disposing)

是一种常见的模式。我假设框架中的每个Dispose方法都是这样的(只要可以派生类):

public void Dispose()
{
  Dispose(true);
  GC.SuppressFinalize(this);
}