C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: フォームメンバ変数のDispose


(過去ログ 123 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■73422 / inTopicNo.1)  フォームメンバ変数のDispose
  
□投稿者/ モモ (7回)-(2014/09/25(Thu) 12:00:23)

分類:[.NET 全般] 

フォーム上部に定義したメンバ変数(フォーム内のグローバル変数)としてDataTableを定義しています。
このDataTableを明示的にDisposeしたいのですが、Dispose処理はどこに記述するのが標準でしょうか。
FormClosingイベント内等でしょうか。
引用返信 編集キー/
■73423 / inTopicNo.2)  Re[1]: フォームメンバ変数のDispose
□投稿者/ 魔界の仮面弁士 (126回)-(2014/09/25(Thu) 12:13:47)
No73422 (モモ さん) に返信
> フォーム上部に定義したメンバ変数(フォーム内のグローバル変数)としてDataTableを定義しています。
> このDataTableを明示的にDisposeしたいのですが、Dispose処理はどこに記述するのが標準でしょうか。

DataTable や DataSet は IDisposable.Dispose を実装していますが、Dispose を呼ばなくても問題ありません。

これらは System.ComponentModel.Component を継承しているために Dispose メソッドを持ちますが、
特にオーバーライドはされておらず、単に Component.Dispose を呼んでいるだけですので、
DataTable 自体が何かの破棄処理を行っているわけではありません。
(DataTable を継承して、Dispose に破棄処理を記載した自作クラスを作るなら別ですが)


> FormClosingイベント内等でしょうか。
どちらかといえば、FormClosed かな?
引用返信 編集キー/
■73424 / inTopicNo.3)  Re[2]: フォームメンバ変数のDispose
□投稿者/ なちゃ (8回)-(2014/09/25(Thu) 13:01:22)
> これらは System.ComponentModel.Component を継承しているために Dispose メソッドを持ちますが、
> 特にオーバーライドはされておらず、単に Component.Dispose を呼んでいるだけですので、
> DataTable 自体が何かの破棄処理を行っているわけではありません。
> (DataTable を継承して、Dispose に破棄処理を記載した自作クラスを作るなら別ですが)

どうでもいいレベルの話ではあるのですが一応。
DataTableなどは、Componentではなく、MarshalByValueComponentの方ですね。
いずれにしても同じ理由でDisposeは不要(メリットは特にない)という話には変わりありません。

引用返信 編集キー/
■73425 / inTopicNo.4)  Re[3]: フォームメンバ変数のDispose
□投稿者/ モモ (8回)-(2014/09/25(Thu) 13:02:28)
ありがとうございます!
とても勉強になりました。
引用返信 編集キー/
■73427 / inTopicNo.5)  Re[2]: フォームメンバ変数のDispose
□投稿者/ WebSurfer (351回)-(2014/09/25(Thu) 14:35:47)
No73423 (魔界の仮面弁士 さん) に返信

> DataTable や DataSet は IDisposable.Dispose を実装していますが、Dispose を呼ばなくても問題ありません。

Dispose メソッドの実装
http://msdn.microsoft.com/ja-jp/library/vstudio/fs2xkftw(v=vs.100).aspx

上記の MSDN ライブラリによると、

"Dispose メソッドは、破棄するオブジェクトの SuppressFinalize メソッドを
呼び出す必要があります。SuppressFinalize を呼び出すと、オブジェクトが終
了キューに置かれている場合は、そのオブジェクトの Finalize メソッドの呼び
出しは行われません。Finalize メソッドの実行は、パフォーマンスに影響を与
えることを覚えておいてください。"

とのことです。

なので、そのページのサンプルコードにあるように Dispose() メソッドが以下
のように定義されているとすれば、GC.SuppressFinalize(this) によって「パ
フォーマンスに影響を与える」という Finalize メソッドの実行を避けることが
できるということは無いのでしょうか?

public void Dispose() 
{
    Dispose(true);

    // Use SupressFinalize in case a subclass
    // of this type implements a finalizer.
    GC.SuppressFinalize(this);      
}

外していたら失礼しました。

引用返信 編集キー/
■73428 / inTopicNo.6)  Re[3]: フォームメンバ変数のDispose
□投稿者/ なちゃ (9回)-(2014/09/25(Thu) 15:00:29)
> なので、そのページのサンプルコードにあるように Dispose() メソッドが以下
> のように定義されているとすれば、GC.SuppressFinalize(this) によって「パ
> フォーマンスに影響を与える」という Finalize メソッドの実行を避けることが
> できるということは無いのでしょうか?
>
> public void Dispose()
> {
> Dispose(true);
>
> // Use SupressFinalize in case a subclass
> // of this type implements a finalizer.
> GC.SuppressFinalize(this);
> }

DataTableやDataSetはこれには該当しません。
一般に解放が不要と考えられるクラス全部が対応されてるかは不明ですが、そいくつか確認した範囲ではそれなりに対応されているように見えますね。

引用返信 編集キー/
■73429 / inTopicNo.7)  Re[4]: フォームメンバ変数のDispose
□投稿者/ なちゃ (11回)-(2014/09/25(Thu) 15:25:14)
ちょっと言葉足らずな気がしますので補足です。
DataTableなどのクラスでは、コンストラクタがGC.SuppressFinalizeを自動で実行するようになっています。

クラスの説明でDisposeの実行などによる解放が必要的な記述がないクラスは、こうなっている物があります。
ただ、どの程度徹底されているかは未確認です。

少なくともDataTableやDataSetについてはそのように実装されています。
解決済み
引用返信 編集キー/
■73431 / inTopicNo.8)  Re[5]: フォームメンバ変数のDispose
□投稿者/ WebSurfer (352回)-(2014/09/25(Thu) 16:37:41)
No73429 (なちゃ さん) に返信

> DataTableなどのクラスでは、コンストラクタがGC.SuppressFinalizeを自動で実行するようになっています。

回答をありがとうございました。ソースを見てきましたが、確かにその通りでした。

なので、現時点で DataTable のソースを見る限り Dispose() を読んで GC.SuppressFinalize を
実行する必要はありませんね。


> ただ、どの程度徹底されているかは未確認です。

それが問題ですね。MSDN ライブラリなどにはコンストラクタでの GC.SuppressFinalize の実装は
ドキュメント化されて無いのでソースを見ないと分からないし、ソースコードは変更される可能性
があるし、DataTable がネイティブリソースを将来絶対持たないとは保障されてないし。

それを考えると、IDisposable を継承するクラスは Dispose() を呼ぶべきというのが基本ルール
であろうと依然として思っています。


引用返信 編集キー/
■73432 / inTopicNo.9)  Re[6]: フォームメンバ変数のDispose
□投稿者/ WebSurfer (353回)-(2014/09/25(Thu) 16:40:07)
解決済みチェックをつけるのを忘れてました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -