Да, вы должны избавиться от них - не только ручкой и кистью, но также Bitmap
и Graphics
.
Они не удаляются, когда находятся вне области видимости, потому что сами переменные являются ссылками, а не объектами, и компилятор C # не знает, принадлежит ли владелец этим ссылкам или нет (например, FillEllipse
может, теоретически, запомните приведенную ссылку и попробуйте использовать ее в более поздний момент - помните, что компилятор языка не обладает специальными знаниями по семантике библиотеки!).
Если вы хотите указать, что право собственности ограничено этой областью, вы используете оператор using
:
using (Bitmap bmp = new Bitmap ( 100, 100 ))
using (Graphics g = Graphics.FromImage ( bmp ))
using (Pen p = new Pen ( Color.FromArgb ( 128, Color.Blue ), 1 ))
using (Brush b = new SolidBrush ( Color.FromArgb ( 128, Color.Blue ) ))
{
g.FillEllipse ( b, 0, 0, 99, 99 );
g.FillRegion ( b, pictureBox1.Region );
}
Это заставит компилятор вставлять вызовы к Dispose
автоматически по мере необходимости, гарантируя, что все объекты удаляются после того, как соответствующая область действия using
оставлена (как правило, путем передачи управления, такой как return
или break
, или исключение).
Если вы пришли из фона C ++, using
в C # прямо аналогичен const std::auto_ptr
, за исключением того, что здесь используется языковая конструкция, и его можно использовать только для локальных переменных (т.е. не для полей класса).