Как располагаются объекты Pen объекта .NET, если вы явно не вызываете Dispose для них? - PullRequest
4 голосов
/ 07 февраля 2012

При написании небольшого подобного рисованию приложения (для себя) у меня изначально был следующий код, вызываемый в обработчике onClick:

g.DrawEllipse((new Pen(pencolour, penSize)), e.X, e.Y, 1, 1);

, который позже я изменил на

Pen pen1 = new Pen(pencolour, penSize);
g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
pen1.Dispose();

Мой вопрос: эквивалентны ли две части кода, или первая создает объекты Pen, которые никогда не удаляются?

Ответы [ 4 ]

7 голосов
/ 07 февраля 2012

Они удаляются, когда работает сборщик мусора и определяет, что объект больше не используется.Лучше утилизировать объекты самостоятельно, поэтому ресурсы освобождаются немедленно.

Также рассмотрите возможность использования оператора using:

using (Pen pen1 = new Pen(pencolour, penSize))
{
    g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
}

Это автоматически удаляет перо, даже еслиDrawEllipse вызовет исключение, и в среде IDE будет установлено, что pen1 доступен только из блока using.

4 голосов
/ 07 февраля 2012

Поскольку Pen реализует IDisposable, лучше использовать оператор using , чтобы обеспечить вызов Dispose.

using (Pen pen1 = new Pen(pencolour, penSize))
{
    g.DrawEllipse(pen1, e.X, e.Y, 1, 1);
}

Если вы этого не сделаете, pen1 будет позже скопирован GC, так как он не будет использован после того, как выйдет за рамки.

0 голосов
/ 07 февраля 2012

Утилизация, безусловно, не вызывается методом DrawEllipse, поэтому два фрагмента не совпадают.

0 голосов
/ 07 февраля 2012

Первый создает объекты Pen, которые никогда не удаляются. В конечном итоге они будут GC'd, но они будут временно утекать любые неуправляемые ресурсы, которые перо оборачивает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...