2016-08-16 13 views
0

を配置しますメソッドの終わり。は、私は2つのクラスを持って、基本クラスの前に継承されたクラス

protected override void Dispose (bool disposing) 
{ 
    base.Dispose(disposing); 

    if (!this.Disposed) 
    { 
     if (disposing) 
     { 
      // Managed. 
     } 

     // Unmanaged. 

     this.Disposed = true; 
    } 
} 

これは悪い習慣と見なされた場合、私はわからない。しかし、最近のシナリオでは、次のように派生クラスのオブジェクトの前に、基本クラスのオブジェクトを配置する必要があります。気を付けることは何ですか?

+3

私は、あなたがこの要件を持つのが珍しいため、このバリアントは表示されないと思います。基本クラス*が最初に「Dispose」する必要がある理由について少し詳しく説明できますか?それは、あなたが珍しい生涯や関係を持つクラスをいくつか持っていることを示す傾向があります。 –

+0

@Damien_The_Unbeliever:フォローアップメッセージの内容を説明します。一方で、この変種を持つ一般的な悪夢は見えますか? –

+0

@Damien_The_Unbeliever: 'UnitOfWorkBase'クラスは汎用の' IDbTransaction'オブジェクトを含み、 'UnitOfWorkSql'クラスは具体的な' DbContext'オブジェクトを含みます。すべての予測可能なデータベースプラットフォームが 'IDbTransaction'を使用するので、トランザクションオブジェクトを基本クラスに保持することを選択しました。また、私は実際のトランザクションオブジェクトを 'public'または' protected'として公開したくありません。したがって、 'UnitOfWorkSql'クラスは常に' using'ステートメントでラップされますが、 'private'トランザクションオブジェクトは最初に処理される必要があります。希望は意味をなさない。 –

答えて

1

ここで通常のパターンを破るべきだと思います。代わりに:

class BaseClass 
{ 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      //dispose my resources 
     } 
    } 
} 

書き込みのようなもの:

class BaseClass 
{ 
    private void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      //dispose my resources 
      DisposeManagedOverride(); 
     } 

     CloseUnmanagedOverride(); 
    } 

    protected virtual void DisposeManagedOverride() {} 

    protected virtual void CloseUnmanagedOverride() {} 
} 

あなたは、リソースの解放の正しい順序を保証するこの方法です。

関連する問題