1

我有以下代码:

using System.Drawing;
...
Graphics _graphics = Graphics.FromImage(...)
...
public void Draw(Stream stream, Rectangle rect, Color color) {
    _graphics.FillRectangle(new SolidBrush(Color), 0, 0, Width, Height);
    _graphics.DrawImage(new Bitmap(stream), rect);
}

我应该使用 on 包围 drawImagenew Bitmap(...)吗?同样的问题new SolidBrush(...)

4

2 回答 2

4

是的,您应该将它们包装在 using 语句中。此外,您应该确保在_graphics您在此类中使用的实例上调用 Dispose 方法。这可以通过实现包含类来完成,IDisposable以便此类的使用者可以将其包装在using语句中。

于 2012-12-25T09:43:41.437 回答
2

是的,处置这些资源很重要。特别是位图很麻烦,它消耗大量的非托管内存来存储像素数据,但托管的 Bitmap 类包装器非常小。您可以在触发垃圾回收之前创建大量Bitmap 对象,从而导致 Bitmap 构造函数开始失败的可能性很高,因为没有更多的非托管内存可用。

所以像这样重写它:

public void Draw(Stream stream, Rectangle rect, Color color) {
    using (var bmp = new Bitmap(stream))
    using (var brush = new SolidBrush(Color)) {
        _graphics.FillRectangle(brush, 0, 0, Width, Height);
        _graphics.DrawImage(bmp, rect);
    }
}
于 2012-12-25T14:42:59.973 回答