Smaltire gli oggetti in Visual Basic

Nell'articolo, Coding New Instances of Objects, ho scritto dei vari modi in cui Nuovo istanze di oggetti possono essere create. Il problema opposto, l'eliminazione di un oggetto, è qualcosa di cui non dovrai preoccuparti molto spesso in VB.NET. .NET include una tecnologia chiamata Netturbino (GC) che di solito si occupa di tutto ciò che sta dietro le quinte in modo silenzioso ed efficiente. Ma di tanto in tanto, di solito quando si utilizzano flussi di file, oggetti sql o oggetti grafici (GDI +) (ovvero risorse non gestite), potrebbe essere necessario assumere il controllo della disposizione degli oggetti nel proprio codice.

Innanzitutto, alcuni retroscena

Proprio come a controstructor (il Nuovo parola chiave) crea un nuovo oggetto, a destructor è un metodo che viene chiamato quando un oggetto viene distrutto. Ma c'è un problema. Le persone che hanno creato .NET hanno capito che era una formula per i bug se due diversi pezzi di codice potevano effettivamente distruggere un oggetto. Quindi .NET GC è effettivamente sotto controllo ed è di solito l'unico codice in grado di distruggere l'istanza dell'oggetto. Il GC distrugge un oggetto quando decide e non prima. Normalmente, dopo che un oggetto lascia l'ambito, lo è

instagram viewer
rilasciato dal Common Language Runtime (CLR). Il GC distrugge oggetti quando il CLR necessita di più memoria libera. Quindi la linea di fondo è che non è possibile prevedere quando GC distruggerà effettivamente l'oggetto.

(Welllll... È vero quasi tutto il tempo. Puoi chiamare GC.Collect e forzare a ciclo di raccolta dei rifiuti, ma le autorità universalmente dicono che è un cattivo idea e totalmente inutile.)

Ad esempio, se il codice ha creato un Cliente Oggetto, potrebbe sembrare che questo codice lo distruggerà di nuovo.

Cliente = Niente

Ma non lo fa. (L'impostazione di un oggetto su Nothing è comunemente chiamata, dereferenziazione l'oggetto.) In realtà, significa solo che la variabile non è più associata a un oggetto. Qualche tempo dopo, il GC noterà che l'oggetto è disponibile per la distruzione.

A proposito, per gli oggetti gestiti, nulla di tutto ciò è veramente necessario. Sebbene un oggetto come un pulsante offrirà un metodo Dispose, non è necessario usarlo e poche persone lo fanno. I componenti di Windows Form, ad esempio, vengono aggiunti a un oggetto contenitore denominato componenti. Quando si chiude un modulo, il suo metodo Dispose viene chiamato automaticamente. Di solito, devi solo preoccuparti di tutto ciò quando usi oggetti non gestiti e anche solo per optomizzare il tuo programma.

Il modo consigliato per rilasciare qualsiasi risorsa che potrebbe essere trattenuta da un oggetto è chiamare il Smaltire metodo per l'oggetto (se disponibile) e quindi dereference l'oggetto.

Cliente. Dispose () Cliente = Niente

Poiché GC distruggerà un oggetto orfano, indipendentemente dal fatto che tu abbia impostato la variabile oggetto su Nothing, non è davvero necessario.

Un altro modo consigliato per assicurarsi che gli oggetti vengano distrutti quando non sono più necessari è inserire il codice che utilizza un oggetto in a utilizzando bloccare. Un blocco Utilizzo garantisce lo smaltimento di una o più di tali risorse al termine del codice.

Nella serie GDI +, il utilizzando il blocco viene utilizzato abbastanza frequentemente per gestire quegli oggetti grafici fastidiosi. Per esempio ...

Utilizzo di myBrush come LinearGradientBrush _. = Nuovo LinearGradientBrush (_. Me. ClientRectangle, _. Colore. Colore blu. Rosso, _. LinearGradientMode. Orizzontale) <... pi codice ...> Uso finale

myBrush viene eliminato automagicamente quando viene eseguita la fine del blocco.

L'approccio GC alla gestione della memoria è un grande cambiamento rispetto a come lo ha fatto VB6. Gli oggetti COM (utilizzati da VB6) sono stati distrutti quando un contatore interno di riferimenti ha raggiunto lo zero. Ma è stato troppo facile commettere un errore, quindi il contatore interno era spento. (Poiché la memoria era legata e non disponibile ad altri oggetti quando ciò avveniva, questa veniva chiamata "perdita di memoria".) Invece, GC controlla effettivamente se qualcosa fa riferimento a un oggetto e lo distrugge quando non ce ne sono più Riferimenti. L'approccio GC ha una buona storia in linguaggi come Java ed è uno dei grandi miglioramenti di .NET.

Nella pagina successiva, esaminiamo l'interfaccia IDisposable... l'interfaccia da utilizzare quando è necessario disporre oggetti non gestiti nel proprio codice.

Se si codifica il proprio oggetto che utilizza risorse non gestite, è necessario utilizzare il IDisposable interfaccia per l'oggetto. Microsoft semplifica le cose includendo uno snippet di codice che crea il modello giusto per te.


Fare clic qui per visualizzare l'illustrazione
Fare clic sul pulsante Indietro sul browser per tornare

Il codice aggiunto è simile al seguente (VB.NET 2008):

 Classe ResourceClass. Implementa IDisposable. 'Per rilevare chiamate ridondanti. Privato disposto come booleano = falso. 'IDisposable. Smaltimento secondario sostituibile protetto (_. Disposizione ByVal come booleana) Se non me. Se lo smaltimento Quindi. 'Free altro stato (oggetti gestiti). Finisci se. 'Libera il tuo stato (oggetti non gestiti). 'Imposta i campi di grandi dimensioni su null. Finisci se. Me.disposed = True. End Sub. #Region "Supporto IDisposable" 'Questo codice aggiunto da Visual Basic a. 'implementare correttamente il modello usa e getta. Public Sub Dispose () Implements IDisposable. Dispose. 'Non modificare questo codice. 'Inserisci il codice di pulizia. 'Smaltire (ByVal smaltimento come booleano) sopra. Dispose (True) GC.SuppressFinalize (Me) End Sub. Protected Overrides Sub Finalize () 'Non modificare questo codice. 'Inserisci il codice di pulizia. 'Smaltire (ByVal smaltimento come booleano) sopra. Dispose (False) MyBase. Finalizza () End Sub. #End Region. End Class 

Smaltire è quasi un modello di progettazione degli sviluppatori "forzato" in .NET. C'è davvero solo un modo corretto per farlo e questo è tutto. Potresti pensare che questo codice faccia qualcosa di magico. Non

Prima nota che la bandiera interna disposto semplicemente cortocircuita il tutto in modo da poter chiamare Smaltire (smaltimento) tutte le volte che vuoi

Il codice ...

 GC.SuppressFinalize (Me) 

... rende il tuo codice più efficiente dicendo al GC che l'oggetto è già stato eliminato (un'operazione "costosa" in termini di cicli di esecuzione). Finalize è protetto perché GC lo chiama automaticamente quando un oggetto viene distrutto. Non dovresti mai chiamare Finalize. Il booleano smaltimento indica al codice se il codice ha avviato la disposizione dell'oggetto (True) o se il GC lo ha fatto (come parte di Finalizza sub. Si noti che l'unico codice che utilizza il valore booleano smaltimento è:

 Se lo smaltimento Quindi. 'Free altro stato (oggetti gestiti). Finisci se 

Quando si elimina un oggetto, è necessario eliminarne tutte le risorse. Quando il CLR netturbino elimina un oggetto solo le risorse non gestite devono essere eliminate poiché il garbage collector si occupa automaticamente delle risorse gestite.

L'idea alla base di questo frammento di codice è quella di aggiungere codice per occuparsi degli oggetti gestiti e non gestiti nelle posizioni indicate.

Quando derivate una classe da a classe base che implementa IDisposable, non è necessario sovrascrivere nessuno dei metodi di base a meno che non si utilizzino altre risorse che devono essere eliminate. In tal caso, la classe derivata deve sovrascrivere il metodo Dispose (disposing) della classe base per disporre delle risorse della classe derivata. Ma ricorda di chiamare il metodo Dispose (disposing) della classe base.

Protected Overrides Sub Dispose (ByVal disposing as Boolean) Se Not Me.disposed Then. Se lo smaltimento Quindi. 'Aggiungi il tuo codice alle risorse gestite gratuite. Finisci se. 'Aggiungi il tuo codice per liberare risorse non gestite. Finisci se. MyBase. Smaltire (smaltimento) End Sub

Il soggetto può essere leggermente travolgente. Lo scopo della spiegazione qui è "demistificare" ciò che sta realmente accadendo perché la maggior parte delle informazioni che puoi trovare non ti dicono!

instagram story viewer