- - PR -
Dispose の意味が未だわからないのですが
«前のページへ
1|2|3|4|5
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-11-02 21:42
えっと、「ドキュメントに問い合わせるべき」ということで(^-^; 書きかけて、まとまらなかったので止めたのですが(なので、まとまってないことを先に謝ります)、これまではインスタンスの生存期間の管理と、リソースの生存期間(使用期間)の管理は、別々に行っていたと思います。 ここで、営業の宣伝文句にだまされている、あるいは、拡大解釈しているのではないか、と。 インスタンスは、GC で管理してくれるようになりました。これを、「メモリの管理が不要になりました」と宣伝します。これは問題ありません。 しかし、「メモリの管理」を、「リソースの管理」と解釈してしまったら? または、マネージド リソースだけを指して、「リソースの管理」と宣伝したら? こういう拡大解釈がおこれば、「なぜ、管理してくれるはずなのに、Dispose しなきゃいけないの?」という疑問がわいてくるのではないでしょうか。 で、今回の疑問は、まさにこれではないかと。というか、私がそうだったわけですが(^-^; Win32API の昔から、リソースの管理に関しては、必ず対となる関数の存在が明らかにされていました。open に対して close、alloc に対して free を使用するように、必ず両方向に参照できるように書いてあります。 ですから、まず、ドキュメントに問い合わせるべき。 そして、自分で作るときには、ドキュメントを整備すべき。 まずドキュメントに問い合わせて、使用方法を知る。それが一番ですが、そのきっかけとして、IDispose を継承していることに気がつくというのも、有りかな、と。 まぁ、実装時にどのインターフェイスを継承しているかなんて見えませんから、Dispose を名称変更のために隠蔽されていたら、どうやって気がつくのか、疑問ですが。。。 プレーンな C++ では、「インスタンスの生存期間=リソースの使用期間」とすることが出来たわけで(それが 2006-10-29 19:36 未記入さんのおっしゃっていることだと思いますが)、そういうことに慣れていると、「インスタンスの生存期間≠リソースの使用期間」というのは、難しいのかな、と思ったり。 _________________ | ||||||||||||||||
|
投稿日時: 2006-11-03 11:54
それには大いに賛成です。 個々のクラスの「使い方」は、個別に確認するべきものです。
は誤解ですからねぇ。 そう解釈してしまった人に思い直してもらうほか無いです ;-p
ストックオブジェクトは DeleteObject() しちゃダメですぜ。 Win32 API を使う上でも、open, close のような「対だけ」に注目して、「HBRUSH は使い終わったら必ず DeleteObject() する」ようなコードを機械的に書いてはダメだということです。 操作を行う(コードを書く)前に、その妥当性や必然性をきちんと検討しないとダメで、その拠り所になるのがソースだったりドキュメントだったりするわけです。
それって、それほど良いことなんですかね? 簡潔ではあるけど、常にそれが最良の管理方法かというとそうでもないですよね? 必要なら、使える限りのリソースを使いまくってガンガン処理を実行して、用が済んでからまとめてリソースの解放をした方が高パフォーマンスを引き出せるような場面というのも少なくはないように思います。 .NET が IDisposable を導入したのは、その辺のチューニングを可能とするためのような気がします。 | ||||||||||||||||
|
投稿日時: 2006-11-03 23:32
はい、思い直しました(^_^;) 重要な点だと思うので、強調のために繰り返し。
「簡潔=エレガント=最良」と誤解している人が、少なからずいらっしゃるようなんですけど(^_^;) (このスレッド内の話じゃないですよ。いくつかの質問に、「もっとエレガントな方法があるんじゃないか」「もっとスマートな方法があるんじゃないか」って、出てきていますので) _________________ |
«前のページへ
1|2|3|4|5