- PR -

GridDataViewのDataSourceにセットした値の扱いについて

1
投稿者投稿内容
にゃー
常連さん
会議室デビュー日: 2008/06/26
投稿数: 32
投稿日時: 2008-06-26 10:29
GridDataViewのDataSourceの扱いについて、
教えていただきたいことがあります。

Formに、GridDataViewを設置し、LoadイベントでDataSourceを設定しています。

Loadイベント
Dim Conn as OleDbConnection
Dim Adapter as OleDbDataAdapter
Dim dset as DataSet

〜略〜

DataGridView.DataSource = dset.Tables("ほげほげ")

このとき、Dimで宣言しているため、Conn,Adapter,dsetは、
Loadイベント終了時に破棄されます。
しかし、FormのGridDataViewを見ると、正常にテーブルが設定されています。
Conn,Adapter,dsetを、明示的にdisposeしているときでも、同様です。

ここで疑問に思うのですが、
DataSourceに設定された内容が保持されているのは、なぜだろう?です。

dset(DataSet)が解放されていますが、DataSourceに設定されている
DataSetはどこかに保持されているのでしょうか?

参考サイトであったり、値渡しのため…などであれば、値渡しなことがわかる
なにかしらの情報をご教授願えれば幸いです。

過去ログも調べてはみたのですが、わかりませんでした。
お願い致します。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-26 12:03
引用:

このとき、Dimで宣言しているため、Conn,Adapter,dsetは、
Loadイベント終了時に破棄されます。


ここが誤っています。
参照が残っている場合はガベージコレクションの対象となりません。
DataGridView.DataSource に設定したことにより、
dset は Load を抜けても DataGridView 経由で参照できますから破棄されません。

Dispose に関しては、オブジェクトが使用しているアンマネージリソースを解放するものであって、
オブジェクトの破棄とは全く別の意味です。
にゃー
常連さん
会議室デビュー日: 2008/06/26
投稿数: 32
投稿日時: 2008-06-26 13:16
早速の回答ありがとうございます。

引用:
DataGridView.DataSource に設定したことにより、
dset は Load を抜けても DataGridView 経由で参照できますから破棄されません。

Dispose に関しては、オブジェクトが使用しているアンマネージリソースを解放するものであって、 オブジェクトの破棄とは全く別の意味です。



回答を受けて、Nothingでのテストも行ってみました。
DataGridView.DataSource = dset.Tables("ほげほげ")   ・・・(A)
dset = nothing                        ・・・(B)

この場合でも、DataAGridViewには、テーブルが表示されております。
(A)によりdsetの参照数が0とはならないため、(B)のようにNothingを指定しても
dsetは破棄されていないということなのでしょうか?

バグのように見えてしまうのですが、ガベージコレクタがメモリ管理している
.NETとしては、このようなDataSourceの指定方法は一般的なのでしょうか?
(↑少し質問の意図がズレるかもしれませんが、併せて質問させてください)

【補足】
このプログラムについては、VB2005を使うにあたり、
プログラムの練習として、仮組しているものになります。
GridDataViewに指定されるDataSourceは、ユーザアクションにより変更されると
想定しているため、フォームデザイン時には指定していません。

的がズレた返答かもしれませんが、宜しくお願い致します。
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-06-26 15:07
引用:

回答を受けて、Nothingでのテストも行ってみました。
DataGridView.DataSource = dset.Tables("ほげほげ")   ・・・(A)
dset = nothing                        ・・・(B)

この場合でも、DataAGridViewには、テーブルが表示されております。
(A)によりdsetの参照数が0とはならないため、(B)のようにNothingを指定しても
dsetは破棄されていないということなのでしょうか?


その通りです。

引用:

バグのように見えてしまうのですが、ガベージコレクタがメモリ管理している
.NETとしては、このようなDataSourceの指定方法は一般的なのでしょうか?
(↑少し質問の意図がズレるかもしれませんが、併せて質問させてください)


はい、普通だと思います。
DataSource に限らずですが、何らかのオブジェクトのプロパティに
クラスのインスタンスを設定したいときに、ローカル変数としてクラスの変数を宣言して
New して設定するというのはよく行われます。


ちなみに GridDataView ではなくて、DataGridView です。
にゃー
常連さん
会議室デビュー日: 2008/06/26
投稿数: 32
投稿日時: 2008-06-27 02:11
すみません。返答が遅くなりました。

引用:
ちなみに GridDataView ではなくて、DataGridView です。


誤字すみませんでした。

親切な回答、ありがとうございます。
参考にさせてもらって、これからも.NETの理解を進めていきたいと思います。
本件は、解決済みと致します。
(スレッドのステータス変更とかなさそう?ですので、本文にて解決済とします)
1

スキルアップ/キャリアアップ(JOB@IT)