文字列の長さを測定するためにフォントを作成する行がC#コードにあります。
int width = (int)(myGraphics.MeasureString(text, new Font(myFontName, myFontSize, FontStyle.Bold)).Width);
私の質問は、new Font()
変数はいつ破棄されるのかということです。フォームが破棄されたときに破棄されますか、それとも即時ですか?
文字列の長さを測定するためにフォントを作成する行がC#コードにあります。
int width = (int)(myGraphics.MeasureString(text, new Font(myFontName, myFontSize, FontStyle.Bold)).Width);
私の質問は、new Font()
変数はいつ破棄されるのかということです。フォームが破棄されたときに破棄されますか、それとも即時ですか?
Font
ファイナライザーが宣言されています:
~Font()
{
this.Dispose(false);
}
フォントオブジェクトが作成されると、ファイナライズキューに登録されます。このようなオブジェクトは、ガベージコレクション中に破棄されません(つまり、メモリが割り当てられたままになります)。後でファイナライザーが呼び出されたときに破棄されます(ファイナライザーは実行できません)。Dispose
したがって、手動またはusing
ステートメントを介して呼び出す方が適切です。この場合、フォントオブジェクトは破棄され、ファイナライズから登録解除されます(したがって、ガベージコレクション中にメモリから削除されます)。
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
ガベージコレクションとファイナライズについて詳しくは、JeffreyRichterの記事をご覧ください。
ガベージコレクターが気になるときはいつでも廃棄されます。すぐに発生することを保証できないため、disposeの使用にあまり依存しないでください。ただし、使用が完了するまでは破棄されないので安心できます(つまり、スコープ内のオブジェクト内に参照が存在しません)。