在Windows窗体中调用Font的dispose()

时间:2014-03-26 12:44:47

标签: c# winforms fonts dispose idisposable

我遇到了与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()方法应该在哪里。

2 个答案:

答案 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语义,所以在大多数情况下可能没有必要做得太好。