我遇到了与this question中描述的问题相同的问题。也就是说,Fortify抱怨创建了字体对象,new Font()
语句在designer.cs文件中生成代码。在查看分析结果时,我确实得到了我需要做的一些事情,至少在某些情况下是这样。
当然,只有当开发人员将自己选择的字体分配给图形设计器中的表单时,这才是问题。我的计划是撤消该选择并在调用InitializeComponent()
后手动创建字体,然后在表单的dispose()
方法中调用dispose()
字体。从那以后,我自己创建资源(并检查它是否在其他地方使用)我确信它不是共享的,可以安全地允许它处理。到目前为止,我对这个问题非常有信心。
现在,在创建表单并且具有布尔dispose()
参数时,也会生成表单的disposing
方法。我不确定(这是我的问题)是我是否可以忽略此参数,或者在调用font.dispose()
之前必须检查它是真还是假。 (我必须承认我还不了解这些生成的winforms中的dispose逻辑)。
更具体地说:生成的代码如下所示:
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
假设形式'myForm'的字体受到影响,我将使用
创建它...
InitializeComponent(); // this is generated into the constructor
this.myForm.Font = new System.Drawing.Font("NiftFontName",...);
...
并致电this.myForm.Dispose()
处理它。问题是,表格'dispose()
方法应该在哪里。
答案 0 :(得分:2)
问题是,表格'dispose()方法应该在哪里。
以下是Microsoft的一条简单规则:
protected virtual void Dispose(bool disposing)
{
if (disposing) {
// Free any managed objects here.
}
// Free any unmanaged objects here.
}
阅读this documentation了解详情。
因此,如果您的字体是从字体文件加载的,那么它是不受管理的,您应该将其置于if (disposing)
块之外。
答案 1 :(得分:2)
控制字体属性很奇怪。对于大多数控件,设置Font
属性将使控件获取Font
特征的快照并自行呈现。控件不会处理字体,也不会关心字体是否处理;即使字体在分配控件的Font
属性之前被放置,控件仍将获取字体特征的快照(即使在处理字体时,控件的快照方法仍然可读)并使用它。请注意,并非所有控件都以这种方式工作,并且我不知道如何使用执行自己绘图的用户控件来模拟此行为。尽管如此,对于某些类型的控件,看似毫无意义的
using (Font myFont = new Font(Whatever))
theButton.Font = myFont;
工作得很好。甚至
myFont = new Font(Whatever);
myFont.Dispose();
theButton.Font = myFont;
会奏效。我怀疑Font
是在微软意识到可共享的不可变一次性对象造成的“所有权”问题之前设计的;自动生成的代码非常草率,Dispose
语义,所以在大多数情况下可能没有必要做得太好。