使用Font设置TextBox字体

时间:2013-12-17 20:58:47

标签: c# fonts idisposable using

我正在建造一个C#Gui。其中包含一个Refresh事件,每隔一秒左右调用一次刷新屏幕。

private void RefreshEverySecond_Tick(object o, EventArgs a) 
{

   if (Condition1) 
   {
      QuickStatusTextBox.Text = "Condition 1";
      QuickStatusTextBox.Font = new Font(QuickStatusTextBox.Font, FontStyle.Bold); 
   } 
   else 
   {
      QuickStatusTextBox.Text = "Condition 2";
      QuickStatusTextBox.Font = new Font(QuickStatusTextBox.Font, FontStyle.Regular); 
   } 

} 

在研究如何做到这一点时,我已经看到了这样的答案,鼓励这种行为:

Easiest way to change font and font size with visual C#

但是我也看到很多喋喋不休的说我应该使用“使用”IDisposable对象,我收集的是Font。

When should I use "using" blocks in C#?

使用字体的例子: http://msdn.microsoft.com/en-us/library/yh598w02.aspx

问题:正确的方式是什么时候定期将文本框从粗体更改为常规?我的方法是否违反任何规则或冒着内存泄漏或争用的风险,因为我没有使用“使用”,并且使用“使用”是否有“正确”的方法?请记住每秒更新一次...所以我可能会让垃圾收集器忙,但是其他副作用会让我感到困惑?

1 个答案:

答案 0 :(得分:1)

Winforms .NET中的Font对象实际上封装了两件事:字体描述和表示该字体的GDI对象的句柄。其中一个代表了有限的资源(GDI句柄)而另一个则没有。

虽然可能有控件使用用于设置其属性的字体的GDI句柄,但内置控件不会这样做。相反,行myControl.Font = myFont;将使myControl捕获由myFont封装的字体的描述,并使其自己的Font对象供内部使用。当控件被释放或其Font被设置为不同的字体时,控件将确保其内部使用myControl.Font对象被处置,但控件既不会处置myFont也不会处理关于何时或是否处置。有趣的是,在执行上述语句之前,如果myFont已经处理了,则无关紧。假设没有其他内容写入,则读取myControl.Font将返回对myFont的引用,而不是控件的内部字体对象;如果已处置myFont,则myControl.Font将返回对已处置的字体对象的引用(但仍可用于设置其他控件的“Font属性”。

如果希望最准确地确保GDI字体资源的快速清理,则可以在创建它们时立即处理将仅用作“模板”并且不用于实际绘图的任何字体对象。我不知道是否应该将其作为模式推荐,因为我找不到控件'Font行为的任何官方文档,但是让字体对象保存永远不会是GDI资源似乎很浪费用过的。它太糟糕了控件'Font属性不使用某种记录的FontDescription类,它只封装字体描述而不是GDI句柄,因为这样的设计会使事情变得更加清晰。 / p>