インターフェイス全般については、MSDN のドキュメントをIDisposable
参照してください。
MSDNのIDisposable.Dispose()
ドキュメントには、具体的に次のように記載されています。
このメソッドを実装するときは、包含階層を介して呼び出しを伝播することにより、保持されているすべてのリソースが解放されることを確認してください。たとえば、オブジェクト A がオブジェクト B を割り当て、オブジェクト B がオブジェクト C を割り当てる場合、A の Dispose 実装は B で Dispose を呼び出す必要があり、B は C で Dispose を呼び出す必要があります。オブジェクトは、そのベースの Dispose メソッドも呼び出す必要があります。クラスが IDisposable を実装している場合。
...それはあなたがしていることです。
設計上の警告の詳細については、MSDN CA1063: IDisposable を正しく実装する を参照してください。
基礎となる FTP 実装が管理されていないと仮定すると、基本実装にファイナライザーがまだ存在しない場合は、ファイナライザーも含める必要があります。MSDNのIDisposable.Dispose()
ドキュメントには、具体的に次のように記載されています。
Dispose メソッドは明示的に呼び出す必要があるため、IDisposable を実装するオブジェクトは、Dispose が呼び出されていないときにリソースの解放を処理するファイナライザーも実装する必要があります。
MSDNObject.Finalize
およびMSDN Implementing Finalize and Dispose to Clean Up Unmanaged Resourcesも参照してください。
継承チェーンのどこかに適切なファイナライザーがない場合、これが警告の理由でしょうか?
(反例として) Microsoft は、コンシューマーDispose()
が直接 呼び出さないことを推奨していることにも注意してください。MSDNusing
ステートメントのドキュメントには次のように記載されています。
原則として、IDisposable オブジェクトを使用する場合は、using ステートメントで宣言してインスタンス化する必要があります。
コンシューマーに推奨されるアプローチはIDisposable
、次のようにリソースを「使用」することです。
using (FTP myDisposableFTP = new FTP()) {
...
}
これは基本的に「シンタックス シュガー」でありDispose()
、使い捨てリソースの使用が終了したとき (つまり、using
ブロックの最後)、または重要なことに、ブロック内でusing
例外が発生したときにメソッドが呼び出されるようにします。
null
このパターンでは、インスタンスがブロックの開始時に構築されているため、インスタンス参照のチェックも必要ありません。また、オブジェクトを再割り当てできないようにします (元の参照がスコープ外になった場合でも、基になるリソースが誤って開いたままになるのを防ぎます)。
ただし、このパターン (または同等の try/catch/finally) を継承/インターフェイスの実装に組み込むことができるかどうかは疑わしいと思います。
そうです、Dispose()
メソッドを呼び出すことは機能的には問題ありません。必要なすべての状況 (例外処理など) で呼び出すことを忘れない限り、または適切に処理するためにそれを消費者に再公開する場合に限ります。 「ラップされた」IDisposable
実装の一部。ただし、リソースが管理されていない場合は、ファイナライザーも追加する必要があります。