我有一个大型项目,它使用内联声明的对象一次性使用(画笔,颜色,字体等)。
当我在VS2010中运行代码分析工具时,我被警告说有些对象不会在每条路径上都被处理掉。
根据下面的代码行,我如何确保在不再使用或发生异常时明确处理所引发的项目。
g.DrawString(stringNames[i],
(Font)new Font("Segoe UI", 7, FontStyle.Regular),
(Brush)Brushes.Black,
new Point(hStart.X - 12, hStart.Y - 6));
提前致谢
答案 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));