
Endowsの日記: Endows の へっぽこプログラマ日誌 第38回 4
日記 by
Endows
『Dispose Finalize パターンってだいたい定型処理だし、なんとか上手くまとめられないか』と思って、こんなのを作ってみた。
しかし、本当にこの程度のことで役に立つなら他にも誰かが同じようなものを作っていそうな気がするし、それなのに見当たらないのは (私の探し方が悪いのでなければ) 何か重大な落とし穴があるからではないかという気もするするし、そもそもこれを使って多少なりとも手間を減らせるかというと、どうだろう…という気もする。
いずれにせよ、まだまだ C# については初心者の域を抜けきれていないので、そもそもこれで問題ないのかというところからして確証が得られない。ということで、教えて C# のえろい人。
えろくないけど (スコア:1)
ってコードはダメじゃね?Dispose(bool disposing)がファイナライザから呼ばれたらdisposerはいないかもよ。
Re:えろくないけど (スコア:1)
なるほど、私が勘違いしていた場所が分かったような気がします。
通常通り Dispose Finalize パターンを実装した場合の bool disposed はファイナライザでも
アクセス可能だけど、私のコードのように Disposer クラスのオブジェクトにしてしまうと、
(先に解放済みかもしれないので) ファイナライザからのアクセスを保証できないということでしょうか。
Disposer を class でなく struct にした場合はどうなのでしょう。やっぱり同じこと?
動くような気はするけど、どうだろ。 (スコア:1)
ん~、structは参照型ではないので別途ファイナライズされるわけではないでしょうが・・・デストラクタもないしね。
Disposeってそのクラスが管理するアンマネージドなリソースとDisposableなマネージドオブジェクトの破棄以外することないわけで、そのクラスに依存したコードしかありえない。更に処理コスト考えるとお勧めはしないです。
Re:動くような気はするけど、どうだろ。 (スコア:1)
ありがとうございます。とりあえずコードの方は class → struct に直したものにしておきました。
(ついでに忘れていた public を付けたり。)
確かに Dispose の基本的な部分はそのクラスに依存したコードだし、その中で定型的な部分を struct Disposer に入れたからといって、今度はその Disposer のオブジェクトを扱うためのコードも必要になるので、 Dispose Finalize パターンの実装がそこまで楽になるかというとちょっと疑問ではあるんですよね。 (作った後で考え直したところですが (^^; )
それに struct にした分の処理コストまで考えると、普通に実装した方が良いと言えそうです。