3

編集:熱心な編集者に、完全な質問を読んでくださいIn addition, since this question is not only about disposing

これまでのところ、私はこれを見てきまし

protected override Dispose(bool disposing)
{
    base.Dispose(disposing);
    if (disposing)
       c.Dispose()
}

そしてこれ

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }

        // There are no unmanaged resources to release, but
        // if we add them, they need to be released here.
    }
    disposed = true;

    // If it is available, make the call to the
    // base class's Dispose(Boolean) method
    base.Dispose(disposing);
}

Microsoft はCA2215: Dispose methods should call base class disposeここに. さらに、この質問は廃棄に関するものだけではないため、最後の行でマイクロソフトが呼び出している別の例を次に示します。base

どれが正しい/最も一般的/より良いですか?

4

2 に答える 2

2

必要に応じて、一連の呼び出しまたは制御フローがすべてです。

最初の例では、基本クラスの破棄がbase.Dispose()最初に呼び出され、クラス自体のコードが実行された後に呼び出されます。2 番目のケースでは、その逆です。

したがって、動作の観点からはどちらも正しいので、現在の要件に最も適したものを選択する必要があります。同じプログラムでも、タイプに関して自然に異なる場合があります。

于 2013-09-29T13:48:38.393 に答える
2

disposedが基本クラスの保護フィールドであるかどうかによって、2 番目のスニペットは疑わしいものになります。

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }    
    }
    disposed = true;    
    base.Dispose(disposing);   // wrong if base.Disposing() depends on disposed
}

考慮すべき問題は、基本クラスと派生クラスの間の例外と依存関係です。したがって、try/finally を使用して、ベース コールを最後に置きます。最も一般的なパターンは次のようになります。

protected virtual void Dispose(bool disposing)
{     
  if (!disposed)
  {
     if (disposing)
     {
        // Dispose managed resources.
     }            
  }           
  base.Dispose(disposing);       
  disposed = true;   // inherited or local field 
}
于 2013-09-29T13:59:01.727 に答える