- PR -

Dispose の意味が未だわからないのですが

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-02 21:42
引用:

渋木宏明(ひどり)さんの書き込み(2006-10-31 18:25)より:
既存のクラスを使う場合、「Dispose() メソッドを持つかどうか(=IDisposable を継承しているかどうか)」は、最初に注目するべきポイントでは無いと思います。

Close() を呼び出すのは「アンマネージリソースを解放するため」ではなく、「Close() を呼び出すことがそのクラスの使い方の一部」であるからです。

ま、結果として得られるコードは同じようなモンなわけですが。


 えっと、「ドキュメントに問い合わせるべき」ということで(^-^;


 書きかけて、まとまらなかったので止めたのですが(なので、まとまってないことを先に謝ります)、これまではインスタンスの生存期間の管理と、リソースの生存期間(使用期間)の管理は、別々に行っていたと思います。

ここで、営業の宣伝文句にだまされている、あるいは、拡大解釈しているのではないか、と。

 インスタンスは、GC で管理してくれるようになりました。これを、「メモリの管理が不要になりました」と宣伝します。これは問題ありません。
しかし、「メモリの管理」を、「リソースの管理」と解釈してしまったら?
または、マネージド リソースだけを指して、「リソースの管理」と宣伝したら?

 こういう拡大解釈がおこれば、「なぜ、管理してくれるはずなのに、Dispose しなきゃいけないの?」という疑問がわいてくるのではないでしょうか。
で、今回の疑問は、まさにこれではないかと。というか、私がそうだったわけですが(^-^;


 Win32API の昔から、リソースの管理に関しては、必ず対となる関数の存在が明らかにされていました。open に対して close、alloc に対して free を使用するように、必ず両方向に参照できるように書いてあります。
ですから、まず、ドキュメントに問い合わせるべき。
そして、自分で作るときには、ドキュメントを整備すべき。

 まずドキュメントに問い合わせて、使用方法を知る。それが一番ですが、そのきっかけとして、IDispose を継承していることに気がつくというのも、有りかな、と。
まぁ、実装時にどのインターフェイスを継承しているかなんて見えませんから、Dispose を名称変更のために隠蔽されていたら、どうやって気がつくのか、疑問ですが。。。

 プレーンな C++ では、「インスタンスの生存期間=リソースの使用期間」とすることが出来たわけで(それが 2006-10-29 19:36 未記入さんのおっしゃっていることだと思いますが)、そういうことに慣れていると、「インスタンスの生存期間≠リソースの使用期間」というのは、難しいのかな、と思ったり。

_________________
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-11-03 11:54
引用:

 えっと、「ドキュメントに問い合わせるべき」ということで(^-^;



それには大いに賛成です。
個々のクラスの「使い方」は、個別に確認するべきものです。

引用:

しかし、「メモリの管理」を、「リソースの管理」と解釈してしまったら?



は誤解ですからねぇ。
そう解釈してしまった人に思い直してもらうほか無いです ;-p

引用:

Win32API の昔から、リソースの管理に関しては、必ず対となる関数の存在が明らかにされていました。open に対して close、alloc に対して free を使用するように、必ず両方向に参照できるように書いてあります。



ストックオブジェクトは DeleteObject() しちゃダメですぜ。

Win32 API を使う上でも、open, close のような「対だけ」に注目して、「HBRUSH は使い終わったら必ず DeleteObject() する」ようなコードを機械的に書いてはダメだということです。

操作を行う(コードを書く)前に、その妥当性や必然性をきちんと検討しないとダメで、その拠り所になるのがソースだったりドキュメントだったりするわけです。

引用:

プレーンな C++ では、「インスタンスの生存期間=リソースの使用期間」とすることが出来たわけで



それって、それほど良いことなんですかね?

簡潔ではあるけど、常にそれが最良の管理方法かというとそうでもないですよね?

必要なら、使える限りのリソースを使いまくってガンガン処理を実行して、用が済んでからまとめてリソースの解放をした方が高パフォーマンスを引き出せるような場面というのも少なくはないように思います。

.NET が IDisposable を導入したのは、その辺のチューニングを可能とするためのような気がします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-03 23:32
引用:

渋木宏明(ひどり)さんの書き込み (2006-11-03 11:54) より:
引用:

 インスタンスは、GC で管理してくれるようになりました。これを、「メモリの管理が不要になりました」と宣伝します。これは問題ありません。
しかし、「メモリの管理」を、「リソースの管理」と解釈してしまったら?
または、マネージド リソースだけを指して、「リソースの管理」と宣伝したら?



は誤解ですからねぇ。
そう解釈してしまった人に思い直してもらうほか無いです ;-p


はい、思い直しました(^_^;)

重要な点だと思うので、強調のために繰り返し。

引用:

引用:
プレーンな C++ では、「インスタンスの生存期間=リソースの使用期間」とすることが出来たわけで


それって、それほど良いことなんですかね?

簡潔ではあるけど、常にそれが最良の管理方法かというとそうでもないですよね?


「簡潔=エレガント=最良」と誤解している人が、少なからずいらっしゃるようなんですけど(^_^;)
(このスレッド内の話じゃないですよ。いくつかの質問に、「もっとエレガントな方法があるんじゃないか」「もっとスマートな方法があるんじゃないか」って、出てきていますので)
_________________

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