C# 如何处置内联声明的对象

C# 如何处置内联声明的对象,c#,dispose,C#,Dispose,我有一个大型项目,使用内联声明对象一次性使用(画笔、颜色、字体等) 当我在VS2010中运行代码分析工具时,有人警告我,有些对象不会在每条路径上都被处理掉 给定下面的代码行,我如何确保在不再使用或发生异常时显式地处理引发的项 g.DrawString(stringNames[i], (Font)new Font("Segoe UI", 7, FontStyle.Regular), (Brush)Brushes.Black, new Point(hStart.X -

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

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

给定下面的代码行,我如何确保在不再使用或发生异常时显式地处理引发的项

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

提前感谢

您可以使用语句将
图形
对象包装在
语句中,以确保使用后立即处理该对象。实现
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));
    }
}

另外,在上面的示例中,您不需要显式地强制转换字体或笔刷对象。这些已经是强类型。

您可以使用
语句将
图形
对象包装在
语句中,以确保使用后立即处理它。实现
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));
    }
}

另外,在上面的示例中,您不需要显式地强制转换字体或笔刷对象。这些已经是强类型的。

不要这样声明非托管资源。

不要那样声明非托管资源。

您不能处置内联声明的对象,必须将其移出行外

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)); 
using (Font font = new Font(...))
   graphics.DrawString(..., font, ...);

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

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

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            segoe7Font.Dispose();
        base.Dispose(disposing);
    }
}

不能处置内联声明的对象,必须将其移出行

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

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

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

    protected override void Dispose(bool disposing)
    {
        if (disposing)
            segoe7Font.Dispose();
        base.Dispose(disposing);
    }
}

很多答案,在上面的示例中,当using语句过期时,内联字体是否会被释放(即与图形对象g一起释放)?@DanielGwalter在本示例中,字体将在图形对象之前立即被释放。它们是两个独立的使用块。另外,感谢您的旁注,作为将来的参考,在犯同样的错误之前,如何确定某个项是否已经是强类型的?您正在构造一个对象(字体类型)--它将返回一个字体对象。至于笔刷,您正在调用静态类笔刷的属性,该属性在其getter中返回一个笔刷对象。因为这些类型正是DrawString方法的签名所要求的类型,所以不需要将它们转换为任何其他类型——在本例中,转换为它们已经存在的类型。很多答案,在上面的示例中,当using语句过期时,内联字体会被释放(即与图形对象g一起释放)?@DanielGwalter在本例中,字体将在图形对象之前立即处理。它们是两个独立的使用块。另外,感谢您的旁注,作为将来的参考,在犯同样的错误之前,如何确定某个项是否已经是强类型的?您正在构造一个对象(字体类型)--它将返回一个字体对象。至于笔刷,您正在调用静态类笔刷的属性,该属性在其getter中返回一个笔刷对象。因为这些类型正是DrawString方法的签名所需要的,所以不需要将它们转换为其他任何类型——在本例中,转换为它们已经存在的类型。这个问题教会我的是内联方法可能快速而简单,但它也增加了可读性、处理和可能的重用方面的问题。我猜上面提到的是对象(f),我可以处理f。这个问题告诉我的是,内联方法可能快速而简单,但它也增加了可读性、处理和可能的重用方面的问题。谢谢,不幸的是,这些对象实际上是一次性使用的对象,否则我会尽早声明并重用它们。这个控件绘制了一个位图,并且只使用了两种字体和两个画笔一次。谢谢,不幸的是,这些都是一次性使用的对象,否则我会尽早声明它们并重用它们。该控件绘制位图,并且只使用两种字体和两个画笔一次。