- - PR -
dispose が必要なインスタンスを static フィールドにしたときのリソース解放
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-28 10:58
はじめまして。
ペンやブラシなどのGDIリソースなどを一つのインスタンスで共有する際、 それを static フィールドとするとアプリケーションが終了するまで解放されないという認識でいるのですが、正しいでしょうか。 public sealed class ClassName { public static System.Drawing.Brush = new System.Drawing.SolidBrush(System.Drawing.SystemColors.Highlight); } | ||||
|
投稿日時: 2004-10-28 11:17
一つのインスタンスで共有という記述の正確な意味が分からないんですが、そもそもstaticにするするのはなぜなんでしょう? # 「複数」のインスタンスでも共有したいってこと? というのはさておき、GDIリソース?等をずっと使いまわすのは多分行儀の悪いプログラムということになるような気がします。基本的には必要なときに作成するってのがマナーじゃないですかね? ※詳しくないので思うだけです。 | ||||
|
投稿日時: 2004-10-28 11:51
なちゃさん、ありがとうございます。
通常は普通にdisposeを実装したクラスを定義して それをインスタンス化して使っているんですが、 ちょっと疑問に思ったので質問させていただいた次第です。 今回の場合、必要となるフィールド数が少ないので static にしてもいいかな、 とか思ったんですが、こういう手抜きがいけないんですよね、ほんとに^^。 | ||||
|
投稿日時: 2004-10-28 13:05
ちなみに私が書いた前半部分は、「一つのインスタンスで共有するのに、なんでインスタンスフィールドでなくてstaticフィールドなんだろう」ということだったんですが、一つのインスタンスとはリソースにあたる方のインスタンスのことだったんですね? Formのインスタンスと読み違えていました。一つのインスタンス「を」共有ということですね。 で、多分よろしくないと思うんですが、私はこれについては感覚で言ってるので信用しすぎないでください。 | ||||
|
投稿日時: 2004-10-28 21:03
フィールド数が少ないのと、staticにしてもいいと考えるのと、どう結びつくのでしょう?「フィールド数が多く、プロパティを作るのが面倒なので、publicアクセスにしてしまえ」とか、「このフィールドはどんな時でも同じものが見えて欲しいからstaticにしよう」だったらわかるのですが。。。 で、(2004-10-28 10:58)のぶんだと、誰かがブラシを変えたくなったとき、どうなるのでしょう?BrushもIDisposableインタフェースを実装しているので、要らなくなったときにDisposeメソッドをコールするのは、開発者の責任です。constされておらず、かつpublicなので、誰でも変更可能ですから、誰かが不用意に変更したら、リークしますよ? #GCが呼ばれたらDisposeもされますけどね #いつ呼ばれるかわからないGCまで、Disposeしなくてもいいのか、という問題 _________________ |
1