dポイントプレゼントキャンペーン実施中!

お世話になっております。
http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、
Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。

環境は、Visual C# 2008 Express Edition です。
.NET 3.5

まず、公開されているWebサービスに対して、
ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。

その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。

ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。
(自動生成のため、別の場所に作成されているのかもしれません。)

using (XSoapClient client = new XSoapClient())
{
 // ここにコード
}

とした場合に、client の Dispose() の実装がわからないため、
しっかりとコネクションが切れているのかが不明です。
Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。

以上、よろしくお願いいたします。

A 回答 (1件)

> ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。



System.ServiceModel.ClientBase<TChannel>は,IDisposable.Disposeを明示的に実装しています。
MSDN: 明示的なインターフェイスの実装 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/ms173157 …
MSDN: ClientBase(TChannel).IDisposable.Dispose メソッド (System.ServiceModel)
http://msdn.microsoft.com/ja-jp/library/bb340248 …

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 …
には,
MSDN: アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装
http://msdn.microsoft.com/ja-jp/library/b1yfkh5e …
というものがあり,その中の「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.d …
にあるように,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は不要です。
また,この例は特殊だと考えた方が良いです。
    • good
    • 0
この回答へのお礼

とても詳しいご説明ありがとうございます。
C#に関してはまだまだ理解が足りないため、参考にさせていただきます。

Microsoft Reference Source Server
から実際のソースも見ることができるのですね。
こちらも参考にさせていただきます。

ありがとうございました。

お礼日時:2010/01/07 09:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!