- PR -

くだらない質問なんですが・・

投稿者投稿内容
eno
常連さん
会議室デビュー日: 2008/08/22
投稿数: 28
お住まい・勤務地: 代々木上原
投稿日時: 2008-09-04 00:50
アプリケーション側にオブジェクトの値、インスタンスの値それぞれ破棄させるDispose()をopenFileDialog1.Dispose();とIDisposable実装させた形でメンバー化しているから、ふつーそれ使っておかんとアンマージのままになるぞって思うから、本当に「特例」とおもっちゃっていいのだろうか・・・(くだらない質問だからいいんですけどね)

インターフェイス実装している時点で、”GC.Collect によって実行される何かが実行されている” 、、この場合は本当にランタイムがヒープマネジメントの一環でオブジェクトの破棄とそのトレースによるすべてのインスタンスのメモリアドレスを空きリストに登録(OSに返却)して、メモリリソースの再利用をしていくことだと思います。マネージメモリに追加されたオブジェクトから同じくマネージできるメモリに登録されているオブジェクトへの有効な参照がないかどうかの検索は定期的に行われるようです。GC.Collectはヒープ領域の圧迫(新規にオブジェクトにメモリ領域の割り当てができない)がされたという設計上の判定で初めて行われるようです。勿論、アプリケーション側からでも、高速処理が要求されるイベントの前処理として明示的に呼び出すのは有効みたいです。ここはJAVAよりアプリケーション側に自由が付与されています。

Azulean
大ベテラン
会議室デビュー日: 2008/01/04
投稿数: 123
お住まい・勤務地: 大阪府
投稿日時: 2008-09-04 07:03
GCの動きの参考資料。

http://www.microsoft.com/japan/msdn/net/mag00/GCI.aspx
http://www.microsoft.com/japan/msdn/net/mag00/GCI2.aspx
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-09-04 23:20
引用:

なちゃさんの書き込み (2008-09-03 23:19) より:
一応つっこんでおくと、OpenFileDialogはDisposeしなくても大丈夫です。


 が〜ん!!Form から派生していると思いこんでいた。で、Form と同じように、「ShowModal と Show で異なる」と、思いこんでいた。


引用:

enoさんの書き込み (2008-09-04 00:50) より:
(くだらない質問だからいいんですけどね)


 何がくだらないのでしょう?リソースの管理については、まじめに取り上げておかないと、とんでもないことになると思いますけど?

引用:

インターフェイス実装している時点で、”GC.Collect によって実行される何かが実行されている”


 IDisposable インターフェイスと GC は関係ありません。IDisposable インターフェイスを実装していなくても、GC は参照されなくなった(破棄した、ではない)メモリを回収します。new で得られるメモリ領域と Dispose は、切り離して考えましょう。



> 定期的に呼び出されてもいなかったと思います。
「GC 用のスレッドがある」と、ツッコミが入りました。
eno
常連さん
会議室デビュー日: 2008/08/22
投稿数: 28
お住まい・勤務地: 代々木上原
投稿日時: 2008-09-05 16:20
が〜ん!!Form から派生していると思いこんでいた。で、Form と同じように、「ShowModal と Show で異なる」と、思いこんでいた。 >>

派生(フォーム上には表示されない && プロセスとして独立していない)とは無関係ということですね。


OpenFileDialogクラスが単に、Windows APIのGetOpenFileName関数のラッパーであることが分かっていれば、Disposeをしなくても動作的に問題ないことは分かるはずなんですが、 >>

この理解の仕方が正しく、かつ解釈に揺らぎをもたせないのでしょう。
要は、GCの対象としてヒープ領域がオブジェクトに割り当てられるようになる。それまではただの関数、数値でインスタンス化されていなかった。。あってますよね?
でも、じゃあなぜDispose()があるのでしょうか???ここが一番ひっかかります。実際にGC.Collect()を間接的に呼び出すのは無論なく、IDisposableを継承していてオブジェクトを破棄するための特別な実装だとおもわずにおれない。。この辺がすっきりしないですね。

> 定期的に呼び出されてもいなかったと思います。
「GC 用のスレッドがある」と、ツッコミが入りました。>>

アプリケーション側から呼び出すという前提からしておかしいですよね。
GCという別の外部プロセス(スレッド)が完全に独立して、アプリ実行中にヒープ領域を管理しているだけの話なので、定期的に有効な参照があるかどうかオブジェクトの値をなめていっていると思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-09-05 18:35
相変わらず同じようなとこでグルグルしてるなぁ ;-p

引用:

要は、GCの対象としてヒープ領域がオブジェクトに割り当てられるようになる。
それまではただの関数、数値でインスタンス化されていなかった。。あってますよね?



さぁ?主語が省略されているので、何を言おうとしているのか不明瞭で分かりません。

ファイルオープン「ダイアログ」のことを言っているなら、OpenFileDialog.ShowDialog() メソッド内で GetOpenFileName() API 呼び出しがおこなれており、その中で

・ダイアログの生成
・ダイアログの表示
・モーダルループ
・ダイアログの廃棄

という一連の操作がおこなれているので、「「ファイルを開くダイアログ」の表示」に関しては、GC や IDisposable インターフェースとの関わりは全くありません。

引用:

じゃあなぜDispose()があるのでしょうか???ここが一番ひっかかります。



既にコメントが付いている通りです。

OpenFileDialog コンポーネントは Compoenet クラスの派生クラスであるためです。

Component クラスは IDisposable インターフェースを継承しているため、OpenFileDialog コンポーネントがまったくアンマネージリソースを使用していないとしても、OpenFileDialog は IDisposable インターフェースを継承します。

Component クラスが「なぜ」IDisposable インターフェースを継承するかと言えば、Component クラスの設計者が「Component クラスの派生クラスであるコンポーネントのどれかは、アンマネージリソースを使用するかもしれない」と判断したからです。

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