- ベストアンサー
ClientBase<TChannel> クラスの Dispose() メソッドについて
- ClientBase<TChannel> クラスの Dispose() メソッドの実装について不明な点があります。
- ClientBase クラスと XSoapClient クラスが Dispose() メソッドを実装していないため、コネクションの切断の仕組みが不明です。
- Dispose() メソッド内では通常、Close() メソッドが呼ばれることが期待されますが、具体的な実装は不明です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 System.ServiceModel.ClientBase<TChannel>は,IDisposable.Disposeを明示的に実装しています。 MSDN: 明示的なインターフェイスの実装 (C# プログラミング ガイド) http://msdn.microsoft.com/ja-jp/library/ms173157.aspx MSDN: ClientBase(TChannel).IDisposable.Dispose メソッド (System.ServiceModel) http://msdn.microsoft.com/ja-jp/library/bb340248.aspx 5572673にて,usingと等価なtry - finallyのコードを書きましたが, finally中でIDisposableにキャストしてDisposeを呼ぶコードになっているのは,明示的な実装にも対応する為です。 > とした場合に、client の Dispose() の実装がわからないため、 > しっかりとコネクションが切れているのかが不明です。 > Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 まず,System.ServiceModel.ClientBase<TChannel>固有の話からします。 Site: Microsoft Reference Source Server http://referencesource.microsoft.com/Default.aspx から取得可能なコードで確認すると, > void IDisposable.Dispose() > { > this.Close(); > } となっているため,IDisposable.Disposeの呼び出しとCloseの呼び出しは等価です。 次に一般論です。Disposeが明示的な実装になっていてCloseが存在する場合, MSDN: クラス ライブラリ開発のデザイン ガイドライン http://msdn.microsoft.com/ja-jp/library/ms229042.aspx には, MSDN: アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装 http://msdn.microsoft.com/ja-jp/library/b1yfkh5e.aspx というものがあり,その中の「Dispose メソッド名のカスタマイズ」の項目で,CloseはDisposeの別名の例として出ているので, .NET Framework標準ライブラリにおいて,CloseとIDisposable.Disposeは同等とみてよいです。 なお,System.Data.SqlClient.SqlConnectionクラスには, MSDN: SqlConnection メソッド (System.Data.SqlClient) http://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnection_methods.aspx にあるように,publicなCloseメソッドとDisposeメソッドがあります。 これは,Closeメソッドを利用した場合は再度Open可能,Disposeメソッドを利用した場合はOpen不可,という使い分けです。 Close後にDisposeはした方がよいと思いますが,Dispose前にCloseすることは, Amazon: .NETのクラスライブラリ設計 開発チーム直伝の設計原則、コーディング標準、パターン http://www.amazon.co.jp/dp/4891006765 に,.NET Framework開発チームのJeff氏のコメントとして, 「SqlConnection.DisposeはSqlConnection.Closeを呼び出す」と書いてあるので,Closeは不要です。 また,この例は特殊だと考えた方が良いです。
お礼
とても詳しいご説明ありがとうございます。 C#に関してはまだまだ理解が足りないため、参考にさせていただきます。 Microsoft Reference Source Server から実際のソースも見ることができるのですね。 こちらも参考にさせていただきます。 ありがとうございました。