C# 在C语言中处理字体对象#

C# 在C语言中处理字体对象#,c#,winforms,dispose,C#,Winforms,Dispose,我有以下代码 Font font = ComboBox.Font; if(condition1) font = new Font(font, FontStyle.Bold); if(condition2) e.Graphics.DrawString("One", font, color, rectangle); else e.Graphics.DrawString("Two", font, color, rectangle); font.Dispose(); 当我运行代码分析时,它显示

我有以下代码

Font font = ComboBox.Font;
if(condition1)
font = new Font(font, FontStyle.Bold);
if(condition2)
  e.Graphics.DrawString("One", font, color, rectangle);
else
  e.Graphics.DrawString("Two", font, color, rectangle);
font.Dispose();
当我运行代码分析时,它显示了一个错误,即“字体”未沿所有异常路径进行处理。在上面的代码中,正确的处理方法是什么


谢谢。

您的问题是,只有在必须创建新字体的情况下才能处理该字体。这就是您需要使用的代码:

Action<Font> drawString =
    f => e.Graphics.DrawString(condition2 ? "One" : "Two", f, color, rectangle);

if (condition1)
    drawString(ComboBox.Font);
else
    using (var font = new Font(ComboBox.Font, FontStyle.Bold))
    {
        drawString(font);
    }
动作抽绳=
f=>e.Graphics.DrawString(条件2?“一”:“二”,f,颜色,矩形);
如果(条件1)
抽绳(ComboBox.Font);
其他的
使用(var font=新字体(ComboBox.font、FontStyle.Bold))
{
抽绳(字体);
}
线索在短语“所有异常路径”中。从本质上讲,代码分析已经注意到DrawString调用可能会引发异常,在这种情况下不会调用Dispose

还有一个问题是处理一个您没有创建的对象,因此一个简单的标志就足够了

正如Samuel在评论中所指出的,将块包装在
try…finally
中,并在
finally
块中调用
Dispose
,如下所示:

Font font = ComboBox.Font;
bool created = false;

try
{
    if(condition1)
    {
        font = new Font(font, FontStyle.Bold);
        created = true;
    }
    if(condition2)
        e.Graphics.DrawString("One", font, color, rectangle);
    else
        e.Graphics.DrawString("Two", font, color, rectangle);
}
finally
{
    if (created)
        font.Dispose();
}
代码分析仍会对此抱怨,因为处置取决于已创建的值,并且代码分析工具不够复杂,无法确定创建和处置条件是否相同。解决方案如所示,特别是创建一个新的
Font
,不管
条件1
的值是什么,并使用该条件在Font对象中选择适当的值。

您不应该处理
组合框。Font
:它应该自己处理
组合框
。 您可以创建
字体
副本:


尝试尝试..最后阻止。与问题无关,但是如果
condition1
为false,为什么要处理字体?@Samuel Try。。最后block解决了这个问题。谢谢。我喜欢你的方法。虽然我不会使用动作,但会将drawString重构为一个新的私有方法。我尝试了使用bool标志,但它仍然显示相同的警告。@Vj87我认为可能是这样的。德米特里的回答有解决问题的办法,所以我编辑确认了这一点。
using (Font font = new Font(ComboBox.Font, condition1 ? FontStyle.Bold : ComboBox.Font.Style)) {
  if (condition2)
    e.Graphics.DrawString("One", font, color, rectangle);
  else
    e.Graphics.DrawString("Two", font, color, rectangle);
}