VB.NET Объем ресурса, созданного с использованием оператора «New» в аргументе подпрограммы - PullRequest
1 голос
/ 01 октября 2019

Мне было интересно, в VB.NET это:

Using tBrush = New SolidBrush(UseColor)      
  e.Graphics.FillRectangle(tBrush, someRect)    
End Using

эквивалентно:

e.Graphics.FillRectangle(New SolidBrush(UseColor), someRect)   

?

т.е. во втором случае будет SolidBrushвыпущен сразу после завершения FillRectangle?

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Это правда, Using блоки создают свои собственные области видимости ... но также и вызовы методов, как во втором примере. .Net достаточно умен, чтобы знать, что кисть недоступна нигде. Поэтому, рассматриваемые только с точки зрения области видимости, эти два варианта достаточно близки, чтобы не иметь какой-либо значимой разницы.

Но область применения здесь не является большой проблемой. Нам также нужно поговорить об утилизации.

В первом примере кисть будет уничтожена, как только закончится блок кода. Во втором примере кисть просто становится приемлемой для удаления, но точное время, в которое происходит такое удаление, все еще не определено.

Обычно удаление происходит довольно быстро, даже во втором случае, и обычно достаточно этого ресурса, не имеет большого значения, если он задерживаетсянемного. Однако иногда это может занять некоторое время, а с некоторыми типами ресурсов или в некоторых средах, где существует большая конкуренция, любая потенциальная задержка может быть проблемой большой . И поскольку вы не всегда управляете средой, в которой выполняется код, хорошая идея придерживаться блока Using всякий раз, когда у вас есть тип, который реализует IDisposable.

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

0 голосов
/ 02 октября 2019

Краткий ответ, да, они эквивалентны. И да, вторая кисть будет выпущена, и в какой-то момент сборщик мусора получит ее.

Первая интересна, хотя, если вы хотите использовать одну и ту же кисть для нескольких прямоугольников, вместо создания экземпляракуча кистей. Вы можете получить аналогичный результат, инициируя вашу кисть как именованную переменную и используя ее, пока она не выйдет из области видимости, если она предпочтительнее ваших потребностей.

...