1

我有一个大型项目,它使用内联声明的对象一次性使用(画笔、颜色、字体等)。

当我在 VS2010 中运行代码分析工具时,我被警告说有些对象不会在每条路径上处理。

鉴于下面的代码行,我如何确保在不再使用或发生异常时明确处理引发的项目。

g.DrawString(stringNames[i],
     (Font)new Font("Segoe UI", 7, FontStyle.Regular),
     (Brush)Brushes.Black, 
     new Point(hStart.X - 12, hStart.Y - 6));

提前致谢

4

4 回答 4

3

Graphics您可以通过将对象包装在using语句中来确保您的对象在使用后立即被处理掉。任何实现IDisposable.

using (Graphics g = e.Graphics)  // Or wherever you are getting your graphics context
{
    using(Font font = new Font("Segoe UI", 7, FontStyle.Regular))
    {
        g.DrawString(stringNames[i], font, Brushes.Black, new Point(hStart.X - 12, hStart.Y - 6));
    }
}

作为旁注,您不需要在上面的示例中显式转换 Font 或 Brush 对象。这些已经是强类型的。

于 2012-05-02T16:40:41.967 回答
2

您不能处理内联声明的对象,您必须将其移出线外。

using (Font font = new Font(...))
   graphics.DrawString(..., font, ...);

但是,如果您每次绘制时都创建相同的字体,则应考虑创建一次并将其附加到使用它的 Control。

class MyControl : Control
{
    private Font segoe7Font = new Font(...);

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            segoe7Font.Dispose();
        base.Dispose(disposing);
    }
}
于 2012-05-02T16:45:28.183 回答
1

只是不要以这种方式声明非托管资源。

于 2012-05-02T16:41:13.237 回答
0
using (var f = new Font("Segoe UI", 7, FontStyle.Regular))
    g.DrawString(stringNames[i], f, (Brush)Brushes.Black, new Point(hStart.X - 12, hStart.Y - 6)); 
于 2012-05-02T16:41:20.077 回答