8

このフィールドを持つクラスがあります:

private WcfChannelFactory<IPrestoService> _channelFactory;

メソッドではDispose()、私はこれをやっています:

if (_channelFactory != null) { _channelFactory.Dispose(); }

しかし、それはエラーを生成します:

IDisposable.Dispose の明示的な実装にアクセスできません

いくつかの調査を行った後、次のように処分できるようです。

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); }

私は2つのことを理解していません:

  1. なぜDispose()利用できないのですか?WcfChannelFactory<T>から派生しChannelFactory<T>、 から派生しChannelFactory、 を実装しIDisposableます。まだ方法ChannelFactoryがありませんDispose()。これはどのように可能ですか?

  2. 単純に を呼び出すことができる (すべきである?) 場合、なぜ XML ドキュメントには も呼び出すと記載さClose()れていないのでしょうか? 多分それはしませんか?これは紛らわしいです。_channelFactoryClose()Dispose()

4

2 に答える 2

7
  1. Disposeメソッドはインターフェイスに対して明示的に実装されているため、IDisposabletype の参照がある場合にのみメソッドを表示できますIDisposable。メソッドはそこにありますが、別の型の参照があると表示されません。これは、常にそこにあるにもかかわらず、プライベート メソッドがクラス自体内のコードからのみ表示される方法に似ています。

  2. メソッドはこのクラスをClose呼び出しません。Disposeこのメソッドはファクトリを閉じず、非同期の終了プロセスを開始します。メソッドが終了するCloseと、クローズ処理が完了していないため、その時点ではオブジェクトを破棄できません。

于 2013-05-08T01:48:36.713 に答える
2

Disposeメソッドは、 interface の明示的なメンバーとして実装されましたIDisposable。つまり、定義は次のようになります。

public class WcfChannelFactory<T> : IDisposable
{
    public void IDisposable.Dispose()
    {
        ...
    }
}

チュートリアル:明示的なインターフェイスの実装のチュートリアル

于 2013-05-08T01:51:57.133 に答える