System.Drawing объекты неуправляемых ресурсов утилизации
У меня есть следующий код:
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);
}
Должен ли я окружить drawImage с помощью на new Bitmap(...)
? Тот же вопрос на new SolidBrush(...)
2 ответа
Да, вы должны обернуть их в использование утверждений. Также вы должны убедиться, что методы Dispose вызываются на _graphics
экземпляр, который вы используете в этом классе. Это можно сделать, используя реализующий класс IDisposable
так что потребитель этого класса может обернуть его в using
заявление.
Да, распоряжение этими ресурсами важно. В частности, растровое изображение является проблематичным, оно потребляет много неуправляемой памяти для хранения данных пикселей, но управляемая оболочка класса 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);
}
}