お世話になっております。
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() メソッドが呼ばれているのが普通なのでしょうか。
以上、よろしくお願いいたします。
No.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は不要です。
また,この例は特殊だと考えた方が良いです。
とても詳しいご説明ありがとうございます。
C#に関してはまだまだ理解が足りないため、参考にさせていただきます。
Microsoft Reference Source Server
から実際のソースも見ることができるのですね。
こちらも参考にさせていただきます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Google Apps Script で getRang...
-
readLine()ではじめから読み直...
-
CSVから読み込んだデータの保持...
-
ArrayList の継承について(初...
-
java のメソッドの使い方について
-
指定された日付・時刻を取得したい
-
ユニコード変換
-
String.containsの反対機能はあ...
-
動画の座標値をマウスクリック...
-
abstract と static を一緒に付...
-
アプレットのinitは、なせ"publ...
-
シェルスクリプトからのJavaメ...
-
C# 点の描き方をおしえてくだ...
-
Processing
-
Eclipse入力保管機能についての...
-
JavaからCへ
-
staticのメリット、デメリット
-
スーパークラスからサブクラス...
-
別クラスのmainメソッドの実行
-
getIdentifier()の意味がよく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
abstract と static を一緒に付...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
説明文書でのメソッド・変数の...
おすすめ情報