パスワードを忘れた? アカウント作成
6513870 journal
プログラミング

Endowsの日記: Endows の へっぽこプログラマ日誌 第38回 4

日記 by Endows

『Dispose Finalize パターンってだいたい定型処理だし、なんとか上手くまとめられないか』と思って、こんなのを作ってみた。
しかし、本当にこの程度のことで役に立つなら他にも誰かが同じようなものを作っていそうな気がするし、それなのに見当たらないのは (私の探し方が悪いのでなければ) 何か重大な落とし穴があるからではないかという気もするするし、そもそもこれを使って多少なりとも手間を減らせるかというと、どうだろう…という気もする。
いずれにせよ、まだまだ C# については初心者の域を抜けきれていないので、そもそもこれで問題ないのかというところからして確証が得られない。ということで、教えて C# のえろい人。

最新の日記

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by jaos (45820) on 2012年10月27日 23時42分 (#2260632) 日記
    disposingの意味考えたら、

            protected virtual void Dispose(bool disposing)
            {
                // Disposer.Dispose(bool disposing) メソッドで Dispose Finalize パターンの
                // 処理が行われる。
                disposer.Dispose(disposing);
            }

    ってコードはダメじゃね?Dispose(bool disposing)がファイナライザから呼ばれたらdisposerはいないかもよ。

    • なるほど、私が勘違いしていた場所が分かったような気がします。
      通常通り Dispose Finalize パターンを実装した場合の bool disposed はファイナライザでも
      アクセス可能だけど、私のコードのように Disposer クラスのオブジェクトにしてしまうと、
      (先に解放済みかもしれないので) ファイナライザからのアクセスを保証できないということでしょうか。
      Disposer を class でなく struct にした場合はどうなのでしょう。やっぱり同じこと?

      親コメント
  • ん~、structは参照型ではないので別途ファイナライズされるわけではないでしょうが・・・デストラクタもないしね。

    Disposeってそのクラスが管理するアンマネージドなリソースとDisposableなマネージドオブジェクトの破棄以外することないわけで、そのクラスに依存したコードしかありえない。更に処理コスト考えるとお勧めはしないです。

    • ありがとうございます。とりあえずコードの方は class → struct に直したものにしておきました。
      (ついでに忘れていた public を付けたり。)

      確かに Dispose の基本的な部分はそのクラスに依存したコードだし、その中で定型的な部分を struct Disposer に入れたからといって、今度はその Disposer のオブジェクトを扱うためのコードも必要になるので、 Dispose Finalize パターンの実装がそこまで楽になるかというとちょっと疑問ではあるんですよね。 (作った後で考え直したところですが (^^; )
      それに struct にした分の処理コストまで考えると、普通に実装した方が良いと言えそうです。

      親コメント
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...