如何处置内联声明的对象

时间:2012-05-02 16:39:30

标签: c# dispose

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

当我在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 个答案:

答案 0 :(得分: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)); } } 的任何对象都是如此。

{{1}}

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分: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));