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属性将返回对用于设置它的对象的引用,但这是在控件观察到其特征后传入的对象将被放入的唯一用途。调用DisposeaFont将阻止它用于绘图,但不会阻止控件观察其特征并Font基于它们制作自己的(可用)对象。实际上,即使在调用控件之后,也可以将字体分配给控件Dispose

可以说,这表明Font控件的属性应该是与IDisposable可以直接用于绘图的字体不同的类型,但是由于框架就是这样,最好简单地认识到Font控件的属性确实使用“字体特征”而不是Font对象。

于 2013-11-08T22:32:46.953 回答