声明一次性对象:在循环内还是循环外?

Declaring a disposable object: inside or outside a loop?

我应该在循环内还是循环外使用 using 块?有什么明显的性能差异吗? Graphics 对象的情况有什么区别吗?虽然第二种方法可能看起来更好,但 while 可能是一个长块并降低代码的可读性。

while (i < 100)
{
    using(Graphics g = Graphics.FromImage(bitmap)
    {
       g.DrawImage(...);
    }
}

对比

using(Graphics g = Graphics.FromImage(bitmap)
{
   while (i < 100) // a long while block
   {
       // I may use other functions such as g.DrawLine .. or g.DrawText ... 
       // Moreover while could be a long block
       g.DrawImage(...);

   }
}

除非您为每个循环使用不同的位图,否则您应该将 using 块放在它之外。

就 while 循环之外的性能而言,您不必创建 100 个对象。不过,这可能取决于您希望如何管理异常。

根据经验,如果您打算只使用该对象一次或该对象不是设计为可重用的,请将 using 放在循环中(SQLCommand class 想到作为一个例子)。否则将它放在循环之外。

在您的具体情况下,如果您打算将同一张图像绘制 100 次,那么在循环之外就是可行的方法。另一方面,如果您的意图是在一个循环内绘制 100 个不同的图像,那么唯一可行的方法是将 using 放在循环内,因为 Graphics 对象不能重复使用与另一张图片。

鉴于示例代码,我绝对会选择第二个选项并将循环放在 using 中。这样的性能要好得多。

如果有额外的逻辑在循环中间更改您正在使用的位图,您可能需要考虑第一个选项。请注意,您可能会受到性能影响。