为多个控件C#分配相同的字体

时间:2013-11-04 10:53:40

标签: c# fonts controls dispose

在多个不同控件中使用的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;
...

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

为什么要在创建字体后立即处理它?你仍然需要(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语句中的代码使用,并且可以正确且安全地处理(即使在这种情况下,您最好避免每次创建它而且应该重复使用它。)

答案 1 :(得分:0)

当设置控件的Font属性时,控件将记录指定字体的特征,然后基于此生成一个新的Font对象供自己使用。读取Font属性将返回对用于设置它的对象的引用,但这是传入对象在控件观察其特征后将被放置的唯一用途。在Dispose上调用Font将阻止它用于绘图,但不会阻止控件观察其特征并根据它们制作自己的(可用的)Font对象。实际上,即使在调用Dispose之后,也可以为控件指定字体。

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