Dispose Objects in Visual Basic

click fraud protection

V článku „Kódovanie nových inštancií objektov“ som písal o rôznych spôsoboch Nový je možné vytvárať inštancie objektov. Opačný problém, ktorým je odloženie objektu, je niečo, o čo sa vo VB.NET nebudete musieť veľmi obávať. NET obsahuje technológiu s názvom Smetiar (GC), ktoré sa zvyčajne postarajú o všetko v zákulisí ticho a efektívne. Ale občas, zvyčajne pri použití súborových tokov, sql objektov alebo grafických (GDI +) objektov (tj nespravované zdroje), možno budete musieť prevziať kontrolu nad likvidáciou predmetov vo svojom vlastnom kóde.

Po prvé, niektoré súvislosti

Rovnako ako oklamaťútočník Nový kľúčové slovo) vytvorí nové objekt, a deStructor je metóda, ktorá sa volá, keď je objekt zničený. Ale je tu háčik. Ľudia, ktorí vytvorili .NET si uvedomili, že to bol vzorec pre chyby, ak by dva rôzne kúsky kódu mohli skutočne zničiť objekt. Takže .NET GC je skutočne pod kontrolou a je to zvyčajne jediný kód, ktorý môže zničiť inštanciu objektu. GC zničí objekt, keď sa rozhodne a nie skôr. Normálne potom, čo objekt opustí rozsah, je

instagram viewer
uvoľnený podľa spoločného jazykového modulu runtime (CLR). GC ničí objektov, keď CLR potrebuje viac voľnej pamäte. Záverom teda je, že nemôžete predpovedať, kedy GC objekt skutočne zničí.

(Welllll... To je pravda takmer celú dobu. Môžeš zavolať GC.Collect a sila a cyklus zberu odpadu, ale úrady všeobecne hovoria, že je zlý nápad a úplne zbytočné.)

Napríklad, ak váš kód vytvoril zákazník Môže sa zdať, že tento kód ho znova zničí.

Zákazník = nič

Ale nie je to tak. (Nastavenie objektu na Nič sa bežne nazýva, dereferencing objekt.) V skutočnosti to len znamená, že premenná už nie je spojená s objektom. O niečo neskôr si GC všimne, že objekt je k dispozícii na zničenie.

Mimochodom, pre spravované objekty nie je nič z toho naozaj potrebné. Aj keď objekt ako Tlačidlo ponúkne metódu Dispose, nie je potrebné ho používať a málo ľudí to robí. Napríklad komponenty Windows Forms sa pridajú do kontajnerového objektu s názvom komponenty. Keď zatvoríte formulár, automaticky sa zavolá metóda Dispose. Zvyčajne sa musíte starať o čokoľvek z toho, keď používate nespravované objekty, a dokonca aj potom len optomalizovať svoj program.

Odporúčaným spôsobom, ako uvoľniť prostriedky, ktoré môžu byť v objekte, je zavolať likvidáciu metóda pre objekt (ak je k dispozícii) a potom dereferenciu objektu.

Zákazník. Likvidáciu () Zákazník = nič

Pretože GC zničí osirotený objekt bez ohľadu na to, či ste nastavili objektovú premennú na Nothing, nie je to naozaj nevyhnutné.

Ďalším odporúčaným spôsobom, ako zabezpečiť, aby boli objekty zničené, keď už nie sú potrebné, je vložiť kód, ktorý objekt používa, do Použitím blok. Blok Použitie zaručuje likvidáciu jedného alebo viacerých takýchto zdrojov po dokončení vášho kódu.

V sérii GDI + Použitím blok sa používa na časté spravovanie týchto otravných grafických objektov. Napríklad ...

Použitie myBrush ako LinearGradientBrush _. = New LinearGradientBrush (_. Me. ClientRectangle, _. Farbu. Modrá farba. Červená, _. LinearGradientMode. horizontálne) <... viac k ...> Koniec používania

myBrush sa automaticky zlikviduje, keď sa vykoná koniec bloku.

Prístup GC k riadeniu pamäte je veľká zmena oproti spôsobu, akým to urobila VB6. Objekty COM (používané vo VB6) boli zničené, keď interné počítadlo referencií dosiahlo nulu. Bolo však príliš ľahké urobiť chybu, takže interný pult bol vypnutý. (Pretože pamäť bola zviazaná a nebola k dispozícii iným objektom, keď sa to stalo, nazývalo sa to „únik pamäte“.) Namiesto toho GC skutočne skontroluje, či čokoľvek odkazuje na objekt a zničí ho, keď už viac neexistuje referencie. Prístup GC má dobrú históriu v jazykoch ako Java a je jedným z veľkých vylepšení v .NET.

Na ďalšej stránke sa pozrieme do rozhrania IDisposable... rozhranie, ktoré sa použije, keď potrebujete zlikvidovať nespravované objekty vo vlastnom kóde.

Ak kódujete svoj vlastný objekt, ktorý používa nespravované prostriedky, mali by ste použiť IDisposable rozhranie pre objekt. Spoločnosť Microsoft to uľahčuje zahrnutím útržku kódu, ktorý pre vás vytvára ten pravý vzor.


Kliknutím sem zobrazíte ilustráciu
Ak sa chcete vrátiť, kliknite v prehliadači na tlačidlo Späť

Pridaný kód vyzerá takto (VB.NET 2008):

 Trieda ResourceClass. Implementácia IDisposable. „Zistiť nadbytočné hovory. Súkromné ​​ako Boolean = Falošné. „IDISposable. Chránené prekrývateľné čiastkové zneškodnenie (_. ByVal zlikvidovaný ako booleovský) Ak nie, potom som ho vyradil. Ak zlikvidujete potom. „Zadarmo iný štát (spravované objekty). Koniec Ak. „Uvoľnite svoj vlastný štát (nespravované objekty). 'Nastaviť veľké polia na null. Koniec Ak. Me.disposed = True. End Sub. #Region "Podpora IDisposable" 'Tento kód pridal program Visual Basic do jazyka. 'správne implementujte vzor na jedno použitie. Verejné čiastkové zneškodnenie () Implementuje sa IDisposable. Nakladať. „Nemeňte tento kód. 'Vložte čistiaci kód. 'Zlikvidujte (ByVal zlikvidujte ako booleovský) vyššie. Zlikvidujte (True) GC.SuppressFinalize (Me) End Sub. Chránené prepíše čiastkové ukončenie () „Tento kód nemeňte. 'Vložte čistiaci kód. 'Zlikvidujte (ByVal zlikvidujte ako booleovský) vyššie. Zlikvidujte (falošné) MyBase. Finalize () End Sub. #End Region. Koncová trieda 

likvidáciu je takmer „vynúteným“ vzorom pre vývojárov v .NET. Existuje skutočne iba jeden správny spôsob, ako to urobiť, a to je všetko. Možno si myslíte, že tento kód robí niečo kúzelné. To nie je.

Najprv si všimnite, že vnútorná vlajka usporiadaný jednoducho skratuje celú vec, aby ste mohli volať Likvidácia (likvidácia) tak často, ako sa ti páči.

Kód ...

 GC.SuppressFinalize (Me) 

... zefektívni váš kód oznámením GC, že objekt už bol zlikvidovaný („nákladná“ operácia z hľadiska realizačných cyklov). Finalizácia je chránená, pretože GC ju volá automaticky, keď je objekt zničený. Nikdy by ste nemali volať Finalizovať. Booleovský likvidáciou povie kódu, či váš kód inicioval likvidáciu objektu (True) alebo či to urobil GC (ako súčasť uzavrieť sub. Všimnite si, že jediný kód, ktorý používa logický reťazec likvidáciou je:

 Ak zlikvidujete potom. „Zadarmo iný štát (spravované objekty). Koniec Ak 

Ak zlikvidujete nejaký objekt, všetky jeho zdroje musia byť zlikvidované. Keď CLR smetiar zlikviduje objekt, preto sa musia zlikvidovať iba nespravované prostriedky, pretože zberateľ odpadu sa automaticky stará o spravované prostriedky.

Myšlienka tohto útržku kódu spočíva v tom, že pridáte kód, ktorý sa postará o spravované a nespravované objekty na označených miestach.

Keď odvodíte triedu z a základná trieda ktorý implementuje IDisposable, nemusíte prepísať žiadnu zo základných metód, pokiaľ nepoužijete iné zdroje, ktoré je tiež potrebné zlikvidovať. Ak sa tak stane, odvodená trieda by mala prepísať metódu Dispose (dispozície) základnej triedy, aby sa zbavili zdroje odvodenej triedy. Nezabudnite však zavolať metódu Dispose (likvidácia) základnej triedy.

Chránené potlačenia nahradzujú (ByVal zneškodňuje ako booleovské), ak nie sú následne zneškodnené. Ak zlikvidujete potom. „Pridajte svoj kód do bezplatne spravovaných zdrojov. Koniec Ak. „Pridajte svoj kód a uvoľnite nespravované zdroje. Koniec Ak. MyBase. Likvidácia (likvidácia) End Sub

Objekt môže byť mierne ohromujúci. Účelom tohto vysvetlenia je „demystifikovať“ to, čo sa v skutočnosti deje, pretože väčšina informácií, ktoré nájdete, vás nehovorí!

instagram story viewer