17

を実装するオブジェクトを構築するファクトリ メソッドがあります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
}    
4

4 に答える 4

19

それをローカル変数に保存し、初期化を 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: 誰かがfinally内で処分することを以前に言及しました-これは明らかに間違っています-呼び出したくない非例外パスでDispose

于 2015-08-21T00:17:00.807 に答える
10

個々のファクトリ メソッド、またはおそらくそれらを含むクラス全体で CA2000 警告を抑制することをお勧めします (ただし、それがそのクラスの唯一の関数である場合のみ)。

さらに、正当な理由を含めることをお勧めします。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability",
    "CA2000:Dispose objects before losing scope",
    Justification = "This is a factory method. Caller must dispose")]
于 2013-12-06T20:17:23.510 に答える
2

使い捨てオブジェクトの作成者がそれを管理していないため、エラーが発生しています。ただし、設計に根本的な問題はありません。消費者が活用することに頼っているだけusingです。たとえば、現在の ADO オブジェクトと大差ありません。

于 2013-12-06T20:10:41.113 に答える
0

もう 1 つの方法は、ファクトリ メソッドを「構成」メソッドに変更し、使い捨てオブジェクトの作成をクライアントに任せることです。例:

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

void Main()
{
  using (var x = new Thing())
  {
   SetupDisposableThing(x);
  }
}
于 2014-06-06T19:49:44.887 に答える