14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

это тво<strong>е</strong> посл<strong>е</strong>дн<strong>е</strong><strong>е</strong> слово?<br />

М <strong>е</strong>тод заб<strong>е</strong>рш<strong>е</strong>ния объ<strong>е</strong>кта<br />

Иногда нужно, чтобы н<strong>е</strong>ки<strong>е</strong> д<strong>е</strong>йствия произош ли до того,<br />

как объ<strong>е</strong>кт отправится в мусор, наприм<strong>е</strong>р вы свобожд<strong>е</strong>ни<strong>е</strong><br />

н<strong>е</strong>управля<strong>е</strong>мых р<strong>е</strong>сурсов.<br />

Так называ<strong>е</strong>мый м<strong>е</strong>тод зав<strong>е</strong>рш<strong>е</strong>ния объ<strong>е</strong>кта (finalizer) позволя<strong>е</strong>т<br />

написать код, который буд<strong>е</strong>т выполняться п<strong>е</strong>р<strong>е</strong>д<br />

уничтож<strong>е</strong>ни<strong>е</strong>м объ<strong>е</strong>кта. Его можно пр<strong>е</strong>дставить, как п<strong>е</strong>рсональный<br />

блок f i n a l l y : он вс<strong>е</strong>гда выполня<strong>е</strong>тся посл<strong>е</strong>дним.<br />

Вот прим<strong>е</strong>р такого м<strong>е</strong>тода для класса C lone:<br />

[ S e r i a l i z a b l e ]<br />

c l a s s C lo n e {<br />

s t r i n g L o c a t i o n ;<br />

i n t C lo n e lD ;<br />

Это конструктором<br />

заполня<strong>е</strong>т поля<br />

ClonelP и Location при<br />

каждом создании оОъ-^<br />

<strong>е</strong>кта Clone.<br />

Вам н<strong>е</strong> прид<strong>е</strong>тся писать м<strong>е</strong>тод зав<strong>е</strong>рш <strong>е</strong>­<br />

ния для объ<strong>е</strong>ктов, обладающих управля<strong>е</strong>мыми<br />

р<strong>е</strong>сурсам и. Вс<strong>е</strong>, с ч<strong>е</strong>м вы<br />

сталкивались в этой книг<strong>е</strong> было управля<strong>е</strong>мым<br />

— оно управлялось CLR. Но<br />

бывают случаи, когда программистам<br />

тр<strong>е</strong>бу<strong>е</strong>тся доступ к базовым р<strong>е</strong>сурсами<br />

W indow s, которы<strong>е</strong> н<strong>е</strong> являются частью<br />

■NET Framework. Скаж<strong>е</strong>м, код с атрибутом<br />

[ D l lI n ç ) o r t ] мож<strong>е</strong>т использовать<br />

н<strong>е</strong>управля<strong>е</strong>мы<strong>е</strong> р<strong>е</strong>сурсы . Если их<br />

вовр<strong>е</strong>мя н<strong>е</strong> удалить (наприм<strong>е</strong>р, соотв<strong>е</strong>тствующ<br />

им м<strong>е</strong>тодом), эти р<strong>е</strong>сурсы могут<br />

повлиять на стабильность сист<strong>е</strong>мы.<br />

И м<strong>е</strong>нно для такой ц<strong>е</strong>ли тр<strong>е</strong>бу<strong>е</strong>тся м<strong>е</strong>тод<br />

зав<strong>е</strong>рш <strong>е</strong>ния объ<strong>е</strong>кта.<br />

p u b l i c C lo n e ( i n t c l o n e l D , s t r i n g l o c a t i o n ) {<br />

t h i s . C l o n e l D = c l o n e l D ;<br />

t h i s . L o c a t i o n = l o c a t i o n ;<br />

}<br />

p u b l i c v o i d T e l l L o c a t i o n ( s t r i n g l o c a t i o n , i n t c l o n e l D ) {<br />

C o n s o l e . W r i t e L i n e ("Мой н ом <strong>е</strong>р { 0 } и " +<br />

"ты найд<strong>е</strong>ш ь м <strong>е</strong>н я т у т : { 1 } ClonelD, location)<br />

}<br />

p u b l i c v o i d W rea k H a v o c( ) {<br />

o n e О {<br />

T e l l L o c a t i o n ( t h i s . L o c a t i o n ,<br />

C o n s o l e .W r it e L in e ( " { 0 } h a s<br />

Знак ~ указыва<strong>е</strong>т, ч т о код в<br />

, этом блок<strong>е</strong> выполня<strong>е</strong>тся, когда<br />

объ<strong>е</strong>кт отправля<strong>е</strong>тся о мусор.<br />

t h i s . C l o n e l D ) ;<br />

b e e n d e s t r o y e d " C lo n e lD )<br />

Зто м<strong>е</strong>тод зав<strong>е</strong>рш<strong>е</strong>ния<br />

объ<strong>е</strong>кта. Он<br />

отправля<strong>е</strong>т н<strong>е</strong>-<br />

Ю Г“ ^°общ<strong>е</strong>ни<strong>е</strong> с<br />

н<strong>е</strong>счастного клона.<br />

Но только посл<strong>е</strong><br />

объ<strong>е</strong>кт<br />

она<strong>е</strong>т пом<strong>е</strong>ч<strong>е</strong>н для<br />

с-оорки Мусора.<br />

М<strong>е</strong>тод зав<strong>е</strong>рш <strong>е</strong>ния объ<strong>е</strong>кта отлича<strong>е</strong>тся<br />

от конструктора т<strong>е</strong>м, что<br />

вм<strong>е</strong>сто модификатора доступа<br />

п<strong>е</strong>р<strong>е</strong>д им<strong>е</strong>н<strong>е</strong>м класса пом<strong>е</strong>ща<strong>е</strong>тся<br />

знак И .NET выполнит этот код<br />

в прямо п<strong>е</strong>р<strong>е</strong>д отправкой объ<strong>е</strong>кта<br />

в мусор.<br />

Этот м<strong>е</strong>тод н<strong>е</strong> им<strong>е</strong><strong>е</strong>т парам<strong>е</strong>тров,<br />

так как .NET должна уничтожить<br />

объ<strong>е</strong>кт.<br />

Рр у д ы п <strong>е</strong><br />

Часть кода в книг<strong>е</strong> пр<strong>е</strong>дназнач<strong>е</strong>на<br />

только для уч<strong>е</strong>бных ц<strong>е</strong>л<strong>е</strong>й.<br />

о а ц ь р о ж н ь ї і<br />

Пока вы только слышали, что объ<strong>е</strong>кт<br />

отправля<strong>е</strong>тся в мусор, как только исч<strong>е</strong>за<strong>е</strong>т ссылка на н<strong>е</strong>го.<br />

Мы готовы показать вам код, автоматич<strong>е</strong>ски запускающий<br />

сборку мусора при помощи м<strong>е</strong>тода GC. C o lle c t () и вызывающ<br />

ий M sssageBox в м<strong>е</strong>тод<strong>е</strong> зав<strong>е</strong>рш<strong>е</strong>ния объ<strong>е</strong>ктов.<br />

Эти в<strong>е</strong>щи затрагивают «с<strong>е</strong>рдц<strong>е</strong>» CLR. Мы показыва<strong>е</strong>м их,<br />

чтобы объяснить принцип сборки мусора. Никогда н<strong>е</strong> используйт<strong>е</strong><br />

их в рабочих программах.<br />

638<br />

глава 14

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!