簡體   English   中英

從方法返回一次性對象時的CA2000

[英]CA2000 when Returning Disposable Object from Method

我有一個工廠方法,可以構建實現IDisposable對象。 最終,調用者可以管理創建對象的生命周期。 這種設計引發了一堆CA2000錯誤 在我的設計中是否存在根本不正確的東西,是否需要重構,還是僅僅對靜態代碼分析警告過於興奮?

工廠方法

public static DisposableType BuildTheDisposableType(string param1, int param2)
{
    var theDisposable = new DisposableType();

    // Do some work to setup theDisposable

    return theDisposable
}

來電者

using(var dt = FactoryClass.BuildTheDisposableType("data", 4))
{
   // use dt
}    

您應該將它存儲到本地變量,並在try-catch-rethrow塊中包裝初始化,以防出現任何異常:

public MyDisposable CreateDisposable()
{
    var myDisposable = new MyDisposable();
    try
    {
        // Additional initialization here which may throw exceptions.
        ThrowException();
    }
    catch
    {
        // If an exception occurred, then this is the last chance to
        // dispose before the object goes out of scope.
        myDisposable.Dispose();
        throw;
    }
    return myDisposable;
}

當不調用Dispose時,盡量不要讓一次性對象容易受到異常的影響

PS:有人先前提到過最終處理 - 這顯然是錯誤的 - 在非異常路徑中你不想調用Dispose

我建議您在每個單獨的工廠方法上抑制CA2000警告,或者可能在包含它們的整個類上抑制CA2000警告(但僅當它是該類的唯一函數時)。

我進一步建議你包括一個理由:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability",
    "CA2000:Dispose objects before losing scope",
    Justification = "This is a factory method. Caller must dispose")]

您收到錯誤是因為一次性對象的創建者沒有管理它。 但是,設計沒有任何根本性的錯誤。 你只是依靠消費者利用using 例如,與當前的ADO對象沒有太大的不同。

另一種方法是將工廠方法更改為“配置”方法,並將創建一次性對象的責任放在客戶端上。 例:

public void SetupDisosableThing(IDisposable foo)
{
 foo.Bar = "baz";
}

void Main()
{
  using (var x = new Thing())
  {
   SetupDisposableThing(x);
  }
}

暫無
暫無

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

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