1

いくつかの異なるコントロールで使用されている C# の Font オブジェクトを破棄するためのベスト プラクティスは何ですか?

例として、同じフォントを割り当てたい複数のテキスト ボックス、ラベル、およびボタンがあります。次のコードを使用することを考えました:

using (Font f = new Font("Calibri", 10.0f))
{
    textbox1.Font = f;
    textbox2.Font = f;
    label1.Font = f;
    button1.Font = f;
}

問題は、f一度使用すると再び使用できなくなり、新しい Font オブジェクトを宣言する必要があることです。これらの状況のベストプラクティスは何ですか? 次のコードを使用する必要がありますか?

Font f;
f = new Font(...);
textbox1.Font = f;
f.Dispose();

f = new Font(...);
textbox1.Font = f;
...

助けてくれてありがとう。

4

2 に答える 2

3

フォントを作成した直後に破棄するのはなぜですか? (Dispose()もう使用しない場合は、呼び出す必要があります)。両方の例のコードを使用できます。 と を削除しても問題Dispose()ありませんusing

Font f = new Font("Calibri", 10.0f);
textbox1.Font = f;
textbox2.Font = f;
label1.Font = f;
button1.Font = f;

または(コンストラクターが一種のキャッシュを管理しない限り、不要なリソースをより多く割り当てるため、効率がわずかに低下しますがFont、それについてはわかりません):

textbox1.Font = new Font("Calibri", 10.0f);
textbox2.Font = new Font("Calibri", 10.0f);
label1.Font = new Font("Calibri", 10.0f);
button1.Font = new Font("Calibri", 10.0f);

編集
リソースの破棄について少し注意してください: もちろん、可能な限り常にリソースを破棄する必要があります (単純なルールは、常にDispose()を実装するクラスを呼び出すことですIDisposable)。つまり、使用前ではなく、使用に行う必要があります。このコードを見てみましょう:

var font = font;
textbox1.Font = font;
font.Dispose();

もちろんtextbox1、破棄されたオブジェクトへの参照があるため、機能しません(何が起こるかわかりませんObjectDisposedException。単に無視されましたか?)。Dispose()将来そのリソースを使用しない場合にのみ呼び出す必要があり、textbox1そのテキストを描画するために使用されるため、そうではありません。たとえば、適切な使用法は次のとおりです。

using (var font = new Font("Calibri", 10.0f))
{
    e.Graphics.DrawText(Text, font, Brushes.Black, ClientRectangle);
}

この場合、ステートメントfont内のコードでのみ使用されusing、適切かつ安全に破棄できます (この場合、毎回作成することを避け、再利用する必要があります)。

于 2013-11-04T10:58:58.830 に答える
0

コントロールのFontプロパティが設定されると、コントロールは割り当てられたフォントの特性を記録し、それFontに基づいて独自に使用する新しいオブジェクトを生成します。プロパティを読み取るFontと、それを設定するために使用されたオブジェクトへの参照が返されますが、コントロールがその特性を観察すると、渡されたオブジェクトが配置される唯一の用途になります。を呼び出すDisposeと、描画に使用されなくなりますが、コントロールがその特性を観察し、それらに基づいてFont独自の (使用可能な) オブジェクトを作成することは妨げられません。Font実際、コントロールを呼び出しDisposeた後でも、コントロールにフォントを割り当てることができます。

おそらく、これが示しているのは、コントロールのプロパティは、描画に直接使用できるフォントとはFont異なるタイプである必要があるということですが、フレームワークはフレームワークであるため、コントロールのプロパティが本当にオブジェクトではなく「フォント特性」で動作します。IDisposableFontFont

于 2013-11-08T22:32:46.953 に答える