У чланку, Кодирање нових инстанци објеката, писао сам о различитим начинима на који Нова могу се створити примерци објеката. Супротан проблем, одлагање предмета је нешто због чега не бисте морали да бринете на ВБ.НЕТ-у врло често. .НЕТ укључује технологију звану Ђубретар (ГЦ) који се обично тихо и ефикасно брине о свему иза кулиса. Али повремено, обично када се користе токови датотека, скл објекти или графички (ГДИ +) објекти (тј. неуправљани ресурси), можда ћете требати да преузмете контролу над одлагањем објеката у сопственом коду.
Прво, нека позадина
Баш као цонструцтор (тхе Нова кључна реч) креира нову објекта, а деструктор је метода која се назива када је објект уништен. Али постоји улов. Људи који су створили .НЕТ схватили су да је то формула за грешке ако два различита дела кода заправо могу уништити објект. Дакле .НЕТ ГЦ заправо контролише и обично је једини код који може уништити инстанцу објекта. ГЦ уништава предмет када се одлучи, а не пре њега. Обично, након што неки објект напусти домет, јесте
пуштен уобичајеним трајањем језика (ЦЛР). ГЦ уништава објеката када ЦЛР треба више слободне меморије. Дакле, суштина је да не можете предвидјети када ће ГЦ заиста уништити објект.(Веллллл... То је истина скоро све време. Можете позвати ГЦ.Цоллецт и форсирати а циклус сакупљања смећа, али власти универзално кажу да је то лоше идеја и потпуно непотребна.)
На пример, ако је ваш код створио Купац објекта, може се чинити да ће га овај код поново уништити.
Клијент = Ништа
Али није. (Постављање објекта Ништа обично се назива, дереференцирање објекта.) У ствари, то само значи да променљива више није повезана са објектом. Нешто касније, ГЦ ће приметити да је објект доступан за уништење.
Успут, за управљане објекте, ништа од овога заиста није потребно. Иако ће објект попут дугмета понудити методу Диспосе, није потребно користити га, а мало људи то ради. На пример, компоненте система Виндовс Формс додају се у објект контејнера компоненте. Када затворите образац, његова метода Диспосе се аутоматски позива. Обично о свему томе морате да бринете само када користите неуправљане објекте, па чак и само зато да оптимизирате свој програм.
Препоручени начин за ослобађање свих ресурса које неки објект може држати је позивање Одложите метода за објект (ако је доступан), а затим уклањање објекта.
Купац. Диспосе () Клијент = Ништа
Будући да ће ГЦ уништити сироти предмет, без обзира да ли поставите променљиву објект на или не, то заиста није неопходно.
Још један препоручени начин да осигурате да се објекти уништавају када им више нису потребни је стављање кода који користи предмет у Користећи блокирати. Коришћење блока гарантује одлагање једног или више таквих ресурса када ваш код буде готов.
У ГДИ + серији Користећи блок се користи да се користи прилично често за управљање тим досадним графичким објектима. На пример ...
Коришћење миБрусх као ЛинеарГрадиентБрусх _. = Нови ЛинеарГрадиентБрусх (_. Ја. ЦлиентРецтангле, _. Боја. Плава боја. Црвено, _. ЛинеарГрадиентМоде. Хоризонтално) <... ...> Крај употребе
миБрусх аутоматски се одлаже када се изврши крај блока.
ГЦ приступ управљању меморијом је велика промена од начина на који је то учинио ВБ6. ЦОМ објекти (које користи ВБ6) су уништени када је унутрашњи бројач референци достигао нулу. Али било је превише лако погрешити да би се унутрашњи бројач искључио. (Пошто је меморија била везана и није била доступна другим објектима када се то догодило, то се назива "цурење меморије".) Уместо тога, ГЦ заправо проверава да ли нешто референцира на неки предмет и уништава га када га нема више референце. ГЦ приступ има добру историју на језицима као што је Јава и једно је од великих побољшања у .НЕТ-у.
На следећој страници проучавамо интерфејс који може да се користи... интерфејс који треба користити када треба да одложите неуправљане објекте у сопственом коду.
Ако кодирате властити објект који користи неуправљане ресурсе, требали бисте га користити ИДиспосабле интерфејс за објект. Мицрософт то олакшава укључивањем исјечка кода који ствара прави узорак за вас.
Кликните овде да прикажете илустрацију
Кликните на дугме Назад у прегледачу да бисте се вратили
Додани код изгледа овако (ВБ.НЕТ 2008):
Класа РесоурцеЦласс. Имплементира ИДиспосабле. 'За откривање сувишних позива. Приватно расположено као бооле = лажно. 'ИДиспосабле. Заштићено премошћивање под одлагањем (_. БиВал распоређује као Бооле) Ако не ја. Ако онда располагате. 'Ослободите другу државу (управљани објекти). Енд Иф. 'Ослободите сопствено стање (неуправљани објекти). 'Подесите велика поља на нула. Енд Иф. Ме.диспосед = Тачно Енд Суб. #Регион "ИДиспосабле Суппорт" 'Овај код је додао Висуал Басиц на. 'правилно имплементирајте образац за једнократну употребу. Јавно подполагање () реализује ИДиспосабле. Одложите 'Не мењајте овај код. 'Ставите код за чишћење. 'Одложите (БиВал распоређује као Боолеан) горе. Диспосе (Труе) ГЦ.СуппрессФинализе (Ме) Енд Суб. Заштићена поништавања Суб Финализе () 'Не мењајте овај код. 'Ставите код за чишћење. 'Одложите (БиВал распоређује као Боолеан) горе. Одложите (лажно) МиБасе. Довршите () Крај Суб. #Енд Регион. Енд Цласс
Одложите је скоро „присиљен“ образац дизајна програмера у .НЕТ-у. Заиста постоји само један исправан начин и то је то. Можда мислите да овај код чини нешто чаробно. Не ради.
Прво узмите у обзир да је унутрашња застава збринути једноставно кратки спој цијеле ствари, тако да можете позвати Збрињавање (одлагање) онолико често колико желите.
Код ...
ГЦ.СуппрессФинализе (Ме)
... чини ваш код ефикаснијим тако што кажете ГЦ-у да је објект већ одложен („скупа“ операција у смислу циклуса извршења). Довршење је заштићено јер га ГЦ аутоматски позива када је објект уништен. Никад не бисте требали звати Финализе. Боолеан располагање каже код да ли је ваш код иницирао одлагање објекта (Труе) или да ли је ГЦ то урадио (као део Доврши суб. Имајте на уму да је једини код који користи боолеан располагање је:
Ако онда располагате. 'Ослободите другу државу (управљани објекти). Енд Иф
Када одложите предмет, сви његови ресурси морају се збринути. Кад ЦЛР Ђубретар збрињава предмет, морају се одлагати само неуправљани ресурси, јер сакупљач смећа аутоматски брине о управљаним ресурсима.
Идеја иза овог исјечка кода је да додате код да бисте се бринули о управљаним и неуправљаним објектима на наведеним локацијама.
Кад изведете часове из а основна класа који имплементира ИДиспосабле, не морате прегласавати ниједну основну методу осим ако не користите друге ресурсе који такође треба да се одлажу. Ако се то догоди, изведена класа би требала надвладати методу Диспосе (диспоситион) основне класе како би се располагала ресурсима изведене класе. Али запамтите да позовете методу Диспосе (диспоситион) основне класе.
Заштићени прегласавања Суб-Диспосе (БиВал распоређује као бооле) ако није Ме.диспосед онда. Ако онда располагате. „Додајте свој код слободним управљаним ресурсима. Енд Иф. 'Додајте свој код слободним не управљаним ресурсима. Енд Иф. МиБасе. Збрињавање (одлагање) Енд Суб
Предмет може бити мало неодољив. Сврха овог објашњења је „демистификовати“ шта се заправо догађа јер већина информација које можете пронаћи не говори вам!