. Стиллмен, Дж. Грин - Изучаем 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