0

これは何度も尋ねられたに違いありませんが、インターネットでこの問題について言及している場所が 1 つも見つかりません。

状況は単純すぎて、解決策がないと信じられません。

public class BaseDispose : IDisposable
{
    void IDisposable.Dispose()
    {

    }
}

public class ChildDispose : BaseDispose, IDisposable
{
    void IDisposable.Dispose()
    {
        //var disp = base as IDisposable;
        //(base as IDisposable).Dispose();
    }
}

アンマネージ リソースを持つ基本クラスがあります。何らかの理由で、IDisposable の暗黙的な実現を介してそれらを破棄します。この基本クラスから派生したクラスがあり、自分自身のリソースと親のリソースの両方を取り除く必要があります。

これはC#でどのように行うことができますか? 上記でコメントアウトした両方の行でコンパイルエラーが発生します

4

1 に答える 1

1

これらのクラスの両方にアクセスできる場合は、Disposable パターンを適切に実装するように変更します

基本クラスにアクセスできない場合は、Child クラスを変更して、基本クラスを継承しないようにしますが、そのインスタンスをメンバーとして含み、通常呼び出す場所に委譲します。base.
ただし、子クラスをベースを期待するものに渡す必要がある場合、これは機能しません。それらをポリモーフィックに処理することはできません。

そうでなければ、あなたの特定の漬物から抜け出す方法がわかりません。

更新
OK、コードを反映して調べたので、System.ServiceModel.ClientBase<TChannel>.Dispose()それは単にメソッドを呼び出すだけClose()なので、disposeメソッドを呼び出すbase.Close()ことは機能的に同等ですが、明らかに理想的ではありません。

また、クラスを封印するか、IDispose を正しく実装します (つまり、暗黙的に を実装しIDisposableないことによります)。

さらにアップデート

Close()こちらに記載されているように、破棄する代わりに呼び出しても問題ないはずですClose & Dispose, which to call?

そして、これは、条件付きでまたはを呼び出す破棄メソッドを含むClientBase<T> 実装の例です。Close()Abort()

お役に立てれば

于 2013-10-22T10:49:44.117 に答える