アカウント名:
パスワード:
ところでそれ、最近の流行でいえばRuby流というか、こういう感じには書けないんでしょうか?HogeForm.ShowDialog do |form| xxxxxend
using( var form = new HogeFrom() ){ form.ShowDialog();}
formのスコープが明確になるし、Dispose()の呼び出しも保証されます。
そう。そしてusingは使っていないがちゃんとDisposeしているのにメモリリークするというのが元に書かれたバグでしょう。CE の環境がないので試せていませんが。
HogeForm.ShowDialog do |form| xxxxxend
これをこんな風に書く必要があるんでしょう。
HogeForm.ShowDialog do |form| xxxxx form = nullend
なんだそれと思ったらその感覚が正しい(笑)
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs
本当にバグの場合もあるけど (スコア:5, 参考になる)
はまった内容:
悪い例:
Form form = new HogeForm();
form.ShowDialog();
form.Dispose();
良い例:
Form form = new HogeForm();
form.ShowDialog();
form.Dispose();
form = null;
最後にnullを設定しないと、このフォームがガベージコレクトされず、
メモリリークします。なんだそれ。
マイクロソフトのサポートに問い合わせたところ、
マイクロソフト側でも現象を確認したそうで、
回答が「最後でnullを設定してね」でした。
マイクロソフトはバグとは言いませんでしたが、どう見てもバグですね。
メモリリークするよ~、あんたのコードが悪いんでしょ~、
なんとかしてよ~、とつつかれて大変でした。
Re:本当にバグの場合もあるけど (スコア:0)
ところでそれ、最近の流行でいえばRuby流というか、こういう感じには書けないんでしょうか?
HogeForm.ShowDialog do |form|
xxxxx
end
Rubyのブロックの使い方の1つとして、
それこそ今回のよう(?)な、リソース開放の手順を隠蔽する道具として使う、というのが有るもので。
open(filename) do |f|
f.xxxx
end
などと書くと「ファイルを開いてブロック内でxxxxさせて、それが終わるとファイルを閉じる」ってのをやってくれる。
こういう書き方が出来るならば、Disposeだろうが=nullだろうが何が来ようが怖くない。みんな隠蔽できるのだから。
この書き方が出来るようになるには、その言語に無名関数があればいい(無名クラスでも代用可)。つまりC#でも上記のようにRuby風にラップできるんじゃないでしょうか?
close忘れるゴミプログラマに対する耐性という意味では、Ruby風は結構美味しいんじゃないかと思ってます。
>最後でnullを設定してね
趣味プロ言語屋から見れば馬鹿としか言いようがないお答えですね。
参照が残るどころか、こっちはもっとアグレッシブというか、参照(変数)が無効になるタイミングをもっと前倒しできないか?と考えてるところだというのに。
適切に前倒しできるようになると、例の「末尾再帰のループへの最適化」(末尾CALLのGOTOへの最適化)が自動的におこなえるようになります。厳密にいえば末尾CALLの「最中」にカレントスコープの変数が期限切れになると見なせるよう設計すればいいはず。最中というのは変な言い方だけど、実際には最後のCALLに変数を「渡した時点」でカレントスコープを殺すといいかな。
Re:本当にバグの場合もあるけど (スコア:2, 参考になる)
Re:本当にバグの場合もあるけど (スコア:1)
そう。そしてusingは使っていないがちゃんとDisposeしているのにメモリリークするというのが元に書かれたバグでしょう。CE の環境がないので試せていませんが。
これをこんな風に書く必要があるんでしょう。
なんだそれと思ったらその感覚が正しい(笑)
LIVE-GON(リベゴン)
Re:本当にバグの場合もあるけど (スコア:1)
問題は、.NET Frameworkという腐ったライブラリ。
個人的には、Microsoftの製品は、上のレイヤーにいくほどダメな仕様になることが多いと思う。
カーネルとか、.NET CLRとか、C#とか、すごく良くできていると思うんですけどねぇ。