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);
}