|
レジスタの話より、公開されているソースをみて議論した方が早そうに思います。 知らなかったんですが、フォントまわりって単純じゃないですね。 (私にはたくボンさんの論点がずっと解らなかったのですが、このあたりの話でしょうか)
実験コードです。
// 引数が同じフォントを2つ作成。 var font1 = new Font("MS ゴシック", 20); var font2 = new Font("MS ゴシック", 20); // 同じコントロールに順次設定。 label1.Font = font1; label1.Font = font2; // 調べごと。 var f1 = font1.Equals(font2); // …true var f2 = object.ReferenceEquals(font1, font2); // …false var f3 = object.ReferenceEquals(label1.Font, font1); // …true var f4 = object.ReferenceEquals(label1.Font, font2); // …false // font1.Dispose(); // var height = label1.Font.GetHeight();
上記の場合に限っては、おかしな話ですけど、厳密には font2 を Dispose する必要があります。 素直に Dispose するようなコード(コメントを有効)を書いちゃうと、例外につながります。 (font2 の設定の前で label1.Font.Dispose をしちゃうのも駄目です。)
これは、Font プロパティが、ごく一般的な実装とは違うためにそのような動作になります。 その実装の前提として、フォントが GDI+ によって同じとみなされる単位で参照カウンタで管理されていることがあるようです。 そのためか(リソースの枯渇に直結しないためか)、上記結果からも、フレームワークとしてはフォントのインスタンスは重要視していないように感じられます。 たくさんフォントを作成してもリソース不足にならなかった理由は、ここにあったようです。 (GDI+ での参照カウンタの話は、フレームワークのソースのコメントに書いてありました。GDI+ の詳細について検索してみたのですが、わかりませんでした。)
最初の私の返信ですが、内容は間違ってないと思いますが、一般的なオブジェクトや普通のプロパティを前提にしていました。けど実際はもう少しややこしい背景があったんですね。
|