实例方法调用Dispose

公共方法在同一个类中调用Dispose of IDisposable是否正确?

例如

public class Worker : IDisposable
{
    public void Close()
    {
       SendCloseCommand();
       Dispose();
    }

    public void Dispose()
    {
       ////other resources release
    }

    private void SendCloseCommand()
    {
    }
}

关于一次性模式的另一件事情:如果总是调用Close,那么从Dispose方法中调用的更好呢?

如果不是这样,我应该把Worker类的用法放在try / catch / finally中,以调用Close。 对?

正确的设计应该是?

public class Worker : IDisposable
{
    public void Close()
    {
       SendCloseCommand();
    }

    public void Dispose()
    {
       Close();
       ////other resources release
    }

    private void SendCloseCommand()
    {
        ////other stuff
    }
}

如果您查看StreamReader Microsoft实现, Dispose将从Close调用,

public override void Close()
{
    Dispose(true);
}

并且Dispose的实现也通过调用基本Stream Close Stream

protected override void Dispose(bool disposing)
{
    // Dispose of our resources if this StreamReader is closable.
    // Note that Console.In should be left open.
    try {
        // Note that Stream.Close() can potentially throw here. So we need to 
        // ensure cleaning up internal resources, inside the finally block.  
        if (!LeaveOpen && disposing && (stream != null))
            stream.Close();
    }
    finally {
        if (!LeaveOpen && (stream != null)) {
            stream = null;
            encoding = null;
            decoder = null;
            byteBuffer = null;
            charBuffer = null;
            charPos = 0;
            charLen = 0;
            base.Dispose(disposing);
        }
    }
}

在您的类实现中,我会像在第一个代码片段中那样从Close方法调用Dispose 。 在Dispose ,我将检查Worker状态,如果未关闭,请使用SendCloseCommand关闭它,然后释放资源。

public void Dispose()
{
   if(this.Status != Closed) // check if it is not already closed
     {
         SendCloseCommand();
     }

   ////other resources release
}

这将确保您的资源处置,即使您的类与using语句一起using ,或者任何人手动调用Close

在发出Close Command之前,请记住检查Worker对象的状态。


Microsoft对实现IDisposable的类有一个关于Close方法的建议。 它是Dispose Pattern指南的一部分:

考虑提供方法Close() ,除了Dispose() ,如果close是区域中的标准术语。

这样做时,使Close实现与Dispose相同并考虑显式实现IDisposable.Dispose方法非常重要。

public class Stream : IDisposable {
    IDisposable.Dispose(){
        Close();
    }
    public void Close(){
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

所以微软的建议是隐藏Dispose并让它调用Close来做实际的清理。 另外,请记住关于多次调用Dispose的指导原则:

允许不止一次调用Dispose(bool)方法。 该方法可能会在第一次调用后不做任何事情。

遵循这些准则可以使您的代码与.NET库保持一致,并且可以避免关于您的类是否应该关闭或处理以进行正确清理的任何混淆。

链接地址: http://www.djcxy.com/p/54519.html

上一篇: Instance method call Dispose

下一篇: Can an IDispose objects not have an available Dispose method