Это правда, Using
блоки создают свои собственные области видимости ... но также и вызовы методов, как во втором примере. .Net достаточно умен, чтобы знать, что кисть недоступна нигде. Поэтому, рассматриваемые только с точки зрения области видимости, эти два варианта достаточно близки, чтобы не иметь какой-либо значимой разницы.
Но область применения здесь не является большой проблемой. Нам также нужно поговорить об утилизации.
В первом примере кисть будет уничтожена, как только закончится блок кода. Во втором примере кисть просто становится приемлемой для удаления, но точное время, в которое происходит такое удаление, все еще не определено.
Обычно удаление происходит довольно быстро, даже во втором случае, и обычно достаточно этого ресурса, не имеет большого значения, если он задерживаетсянемного. Однако иногда это может занять некоторое время, а с некоторыми типами ресурсов или в некоторых средах, где существует большая конкуренция, любая потенциальная задержка может быть проблемой большой . И поскольку вы не всегда управляете средой, в которой выполняется код, хорошая идея придерживаться блока Using
всякий раз, когда у вас есть тип, который реализует IDisposable
.
, я также должен указать на избавление не имеет ничего общего с памятью. Опять же, оба примера имеют одинаковую область видимости, поэтому сборщик мусора восстановит память обоим одинаково. Скорее ресурс, управляемый удалением в этом образце, - это дескриптор GDI , используемый кистью. Без явного удаления этот дескриптор GDI будет освобожден только тогда, когда сборщик мусора в конечном итоге сможет вызвать финализатор объекта. Это может быть какое-то время в системе с низким давлением памяти, следовательно, необходим другой механизм (IDisposable
+ Using
) для его восстановления.