2010-08-06 9 views

risposta

7

No. Ogni oggetto .NET gestito normale viene sottoposto a garbage collection quando non ci si riferisce più ad esso. IDisposable significa che implementerai un metodo Dispose() che deve essere chiamato dal chiamante - di solito rilascia cose che non sono raccolte garbaged. Aiuta anche ad avere un posto deterministico per liberare memoria.

Partenza il modello IDisposable per assicurarsi di farlo bene:

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx

+0

Grazie per la risposta. Quindi, se ho una classe A e una sua funzione pubblica crea un oggetto non gestito come Bitmap e chiama BitMap.Dispose(), quindi sarà spazzatura raccolta o la classe A mantiene un riferimento alla bitmap? – kishore

+0

Quando si chiama Dispose(), verrà eliminato subito (l'oggetto è ora inutilizzabile). Se non lo facessi, alla fine il GC ci arriverebbe e, se fosse stato scritto correttamente (lo era), Finalize chiamerà Dispose(). Ma è necessario chiamare Dispose() (usa l'istruzione using per farlo automaticamente). –

+0

Inoltre, non è necessario implementare IDisposable a meno che non sia necessario. Rende il GC più lento ad avere a che fare con loro (ricordando di chiamare Finalize, ecc.). Se si dispone di una proprietà che è risorse usa e getta o non gestite, quindi implementarla. –

3

No, ogni oggetto viene eliminato automaticamente.

IDisposable è utilizzabile quando si dispone di una sorta di operazione speciale da eseguire alla decostruzione dell'oggetto. Ad esempio, se blocchi alcune risorse come file o simili durante il lavoro del tuo oggetto, puoi rilasciarli nel metodo Dispose.

1

IDisposable deve essere utilizzato quando si desidera utilizzare alcune risorse native come il flusso di file nel codice. Per tutti gli altri scopi, il garbage collector .Net fa un buon lavoro.

Semplicemente l'innesto dell'IDisposable non impone una garbage collection. Il metodo Dispose deve essere chiamato esplicitamente per ripulire qualsiasi risorsa nativa.

Modifica: ti consiglierò di passare attraverso il capitolo Garbage Collection in ClR via C# di Jeff Richter.

1

No. La classe definita dall'utente è raccolta garbaged quando non viene più referenziata da nessuna parte. Puoi forzarlo semplicemente facendo classObject = null. Se questa è l'ultima parte dell'applicazione che fa riferimento attualmente a classObject, la garbage collection cancellerà la sua memoria.

IDisposable viene utilizzato principalmente in modo da poter organizzare le attività di garbage collection tramite i metodi using().

1

No non è così. Il metodo Dispose() è progettato per eseguire un lavoro extra e dispone di risorse che devono essere eliminate quando l'oggetto non viene più utilizzato. Ricorda che la raccolta dei dati può accadere molto tempo dopo che l'oggetto ha perso l'ultimo riferimento.

Quando il IDisposable viene usato si dovrebbe disporre l'oggetto quando il fatto con fx using come

using (SomeClassWithDisp object = new SomeClassWithDisp()) 
{ 
    //Use the object 
} 

Inoltre, si veda:

What is the difference between using IDisposable vs a destructor in C#?

1

In .NET, tutti gli oggetti dovrebbero essere rilasciati dalla memoria con il garbage collector di default a patto che non vengano più utilizzati, quindi non è necessario implementare IDisposable su ogni classe, ma è bene avere una sorta di memo ry meccanismo di rilascio, come un distruttore o il metodo Dispose stesso.

Questo è un buon esempio di un distruttore in uso: http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

1

Il metodo dispose() si implementa viene utilizzato per liberare in modo esplicito le risorse non gestite (file, torrenti, maniglie, ecc) a cui l'oggetto contiene un riferimento.

L'idea è di liberare queste risorse il prima possibile, chiamando il metodo di smaltimento. Il metodo dispose() non eseguirà IMMEDIATAMENTE la garbage collection sul tuo oggetto, ma piuttosto rilascerà le risorse e permetterà al garbage collector di fare le sue cose quando è conveniente.

Problemi correlati