【发布时间】:2014-03-26 12:44:46
【问题描述】:
我遇到了与this question 中描述的相同的问题。也就是说,Fortify 抱怨字体对象的创建,new Font() 语句是在 Designer.cs 文件中生成的代码。在查看分析结果时,我确实觉得我需要对此做一些事情,至少在某些情况下是这样。
当然,只有当开发人员已将他选择的字体分配给图形设计器中的表单时,这才是一个问题。我的计划是撤消该选择并在调用InitializeComponent() 之后手动创建字体,然后在表单的dispose() 方法中为字体调用dispose()。由于这种方式我自己创建了资源(并检查了它是否在其他地方使用),我确信它不是共享的并且可以安全地允许它被处置。到目前为止,我对这个问题相当有信心。
现在表单的dispose() 方法在创建表单时也会生成,并且有一个布尔值disposing 参数。我不确定(这是我的问题)是我是否可以忽略这个参数,或者在调用font.dispose() 之前必须检查它的真假。 (我不得不承认我还不了解这些生成的 winform 中的 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() 方法应该放在哪里。
【问题讨论】:
-
不,不要那样做。字体是非常昂贵的创建对象,它们保存在缓存中,因此重用起来很便宜。 Fortify 还不够聪明,无法知道这一点。微软代码分析器是,它可以读取Font类所具有的[SuppressMessage]属性。
标签: c# winforms fonts dispose idisposable