17

FtpWebResponseクラスを使用していましたが、Disposeメソッドが表示されませんでした。 クラスはIDisposableを実装していることがわかりましたが、明示的に実装しているため、Disposeを呼び出す前にまずインスタンスをIDisposableにキャストする必要があります。

// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();

このようなクラスの設計者がIDisposableを明示的に実装することを選択するのはなぜですか?Anthony Pegramが言うように、この方法で行うことは、クラスを使用するたびにドキュメントを参照していない平均的な開発者のためにオブジェクトを破棄する必要があるという事実を覆い隠します。

4

4 に答える 4

5
  • 場合によっては、クラスにインターフェイスの一部であるDisposeメソッドがありますが、破棄するリソースはメモリのみであるため、実際には呼び出す必要はありません。たとえば、MemoryStreamです。
  • 他の人が述べたように、クラスにDisposeと同じことを行うCloseメソッドがある場合、おそらくDisposeは「using」パターンをサポートするために存在する必要があるだけなので、明示的にすることもできます。
于 2010-06-25T16:02:17.653 に答える
1

私にも少し変です。価値があるのは、基本クラス(WebResponse)がClose()メソッドを実装していることです。Reflectorは、WebResponseのDispose()メソッドがClose()を呼び出すだけで、内部OnDispose仮想は何もしないことを示しています。

少し匂いがすることを告白する必要がありますが、Close()とDispose()の呼び出しの間でIntellisenseに混乱が生じないように、IDisposableを明示的に実装しているに違いありません。

于 2010-06-25T15:44:47.887 に答える
1

言われていることに加えて、実装はブロックIDisposableの使用を明示的に奨励することを提案するかもしれません。これは、実装するすべてのタイプで使用でき、これを書くのが(とにかくほとんどの人にとって)より自然だからです。usingIDisposable

using (var response = GetResponse())
{
    // do something
}

これより:

var response = GetResponse();

// do something

((IDisposable)response).Dispose();

それが明示的に実装する開発者の意図であるかどうかはわかりませんがIDisposable、それは可能です。

于 2010-06-25T15:54:00.437 に答える