Domanda

COME faccio a sapere quando devo smaltire qualcosa? Qualcuno ha appena menzionato che avevo diversi oggetti nel mio codice che devo eliminare. Non avevo idea di dover smaltire nulla (questa è la mia prima settimana con C #). Come faccio a sapere quando devo smaltire un oggetto? stavo usando http://msdn.microsoft.com /en-us/library/system.security.cryptography.hashalgorithm.aspx e non vedo alcuna menzione di smaltimento nella pagina o la vedo menzionare in qualsiasi altro objs mi è stato detto di eliminare (da qualcuno su SO).

So di doverlo fare quando qualcosa eredita IDisposable ma COME LO SO quando lo eredita?

È stato utile?

Soluzione

Dovresti smaltire tutto ciò che implementa IDisposable. Basta avvolgerlo su un utilizzo:

   using(var some = new Something())
   {
    //use normally
   }

Altri suggerimenti

Un modo semplice sarebbe digitare obj.disp e vedere se intellisense ha un metodo dispose.

La classe implementa l'interfaccia IDisposable , ciò significa che ha un metodo Dispose .

Non tutte le classi che implementano IDisposable richiedono di chiamare Dispose , ma la maggior parte di esse lo fa. Se vedi che la classe implementa IDisposable (o ha un metodo Dispose perché eredita l'interfaccia da una classe base), hai due scelte:

  1. Scava in profondità nella documentazione per scoprire perché la classe implementa IDisposable e se hai davvero bisogno di chiamare Dispose .

  2. Basta chiamare Dispose.

Entrambi i metodi sono sicuri. Se il metodo Dispose non fa nulla, la chiamata sarà molto rapida. Puoi persino chiamare Dispose più di una volta senza danni.

Ancora meglio, semplicemente chiamare il metodo Dispose è usare un blocco usando :

using (FileStream s = File.OpenRead(path)) {
   ...
}

Alla parentesi finale del blocco viene chiamato automaticamente il metodo Dispose . Il blocco using è implementato come prova ... finalmente , quindi il metodo Dispose è garantito per essere chiamato anche se si verifica un'eccezione nel blocco.

Se una classe implementa IDisposable dovresti disporre delle intenzioni di quella classe. Altrimenti no. In questo caso HashAlgorithm deriva da ICryptoTransform che deriva da IDisposable. Ciò significa che tutte le istanze di classi che discendono da HashAlgorithm devono essere eliminate.

È necessario eliminare qualsiasi oggetto che implementa l'interfaccia IDisposable.

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable

Tutto ciò che ha risorse non gestite (ad esempio connessioni DB) dovrebbe implementare l'interfaccia IDisposable.

Ci sono un paio di buoni motivi per questo:

  • Sai che le risorse non gestite (che sono in genere piuttosto scarse) verranno ripulite. Di solito questi verranno chiariti nel finalizzatore comunque, ma a causa di come il GC deve riordinare gli oggetti con i finalizzatori ciò potrebbe richiedere del tempo.
  • Se si implementa lo modello di smaltimento standard, si salva il GC molto lavoro in quanto non è necessario chiamare il finalizzatore.
  

So che devo farlo quando qualcosa   eredita IDisposable ma COME LO SO   quando lo eredita?

Supponendo che tu stia utilizzando Visual Studio. Di solito faccio clic con il pulsante destro del mouse sul tipo, quindi " Vai a definizione " ;. Se vedo che esso, o una delle sue superclasse, implementa IDisposable, mi assicuro di chiamare Dispose su di esso. Questo viene generalmente eseguito avvolgendolo in un blocco utilizzando come altri hanno già detto.

" L'ultima persona a lasciare la stanza per favore spegni le luci? "

Un oggetto che implementa IDisposable contiene le informazioni e l'impulso necessari per eseguire alcune operazioni di "pulizia". operazioni che dovrebbero avvenire "a volte", ma che non possono avvenire mentre l'oggetto è ancora in uso. Se l'oggetto viene completamente abbandonato, tali operazioni di pulizia non avverranno. Il sistema include un custode, con il quale gli oggetti possono registrarsi quando vengono creati; se un oggetto viene abbandonato da tutti tranne che dal custode, il custode può chiedere all'oggetto di eseguire le sue azioni di pulizia prima che anche il custode lo abbandoni. Si noti che per una serie di motivi, il custode non è efficace al 100% nella gestione di oggetti abbandonati. È quindi molto auspicabile che, quando possibile, l'ultima entità che contiene un utile riferimento a un oggetto lo disponga prima di abbandonare il riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top