簡體   English   中英

實例方法調用Dispose

[英]Instance method call Dispose

公共方法在同一個類中調用IDisposable的Dispose是否正確?

例如

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

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

    private void SendCloseCommand()
    {
    }
}

關於一次性模式的另一個問題:如果應該總是調用Close,那么從Dispose方法調用是否更好?

如果不是這樣,我應該把工人類的用法在一個try / catch /終於無處不在,調用Close。 對?

應該是正確的設計嗎?

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

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

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

如果您查看StreamReader Microsoft實現 ,則從Close調用Dispose

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

並且Dispose的實現也通過調用Close of base 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指南的一部分:

除了Dispose()之外, CONSIDER提供方法Close() ,如果close是該區域中的標准術語。

這樣做時,將Close實現與Dispose相同並考慮顯式實現IDisposable.Dispose方法非常重要。

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

因此,微軟的建議是隱藏Dispose並讓它調用Close來進行實際的清理。 另外,請記住有關Dispose多次調用的指南:

DO允許多次調用Dispose(bool)方法。 第一次調用后,該方法可能選擇不執行任何操作。

遵循這些指導原則可使您的代碼與.NET庫保持一致,並且您將避免混淆是否應關閉或處理您的類以進行適當的清理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM