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