在多个不同控件中使用的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;
...
感谢您的帮助。
答案 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
对象。