Non sono sicuro di come gli oggetti classe definiti dall'utente vengano eliminati. Devo implementare un'interfaccia IDisposable su ogni classe e chiamare il metodo dispose() su di esso per liberare la memoria?Ogni classe definita dall'utente deve implementare l'interfaccia IDisposable per ottenere la raccolta dei dati inutili
risposta
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
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.
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.
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()
.
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#?
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
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.
- 1. La raccolta dei dati inutili è automatica in C++ standard?
- 2. Quando l'oggetto è idoneo per la raccolta dati inutili?
- 3. È possibile ottenere OutOfMemoryError perché la raccolta dei dati inutili è troppo lenta?
- 4. node.js v8 la raccolta di dati inutili non sembra attivare
- 5. Comportamento della raccolta di dati inutili per String.intern()
- 6. C# Raccolta di dati inutili Root attivi
- 7. Tempo di raccolta dati inutili Java?
- 8. Quando devo implementare IDisposable?
- 9. La raccolta dei dati inutili si verifica immediatamente dopo la chiamata a Hashmap.remove()?
- 10. Come viene eseguita la raccolta dei dati inutili in Java e come si confronta con .net?
- 11. Come implementare correttamente IDisposable
- 12. Oggetto non raccolta dati inutili, ma senza gcroots
- 13. Devo implementare IDisposable per un controllo utente?
- 14. Come implementare l'interfaccia IDisposable in una classe ereditata da SocketAsyncEventArgs
- 15. La metodologia di raccolta dei dati inutili CLR indica che è sicuro lanciare riferimenti di oggetti circolari?
- 16. Raccolta standard per oggetti identificabili
- 17. Utilizzando invariante per IDisposable
- 18. Come implementare un Observer per ottenere dati da un listener?
- 19. Implementazione IDisposable su una classe sigillata
- 20. Dati dinamici per l'associazione dei dati
- 21. Uncaught ReferenceError: la classe non è definita?
- 22. Come selezionare i dati per la pagina definita e il conteggio totale dei record?
- 23. Debug Node.JS con JetBrains variabili mostrano 'La raccolta dei dati ...'
- 24. Come implementare la sostituzione dei sottoinsiemi per i metodi S4
- 25. Come filtrare la raccolta dati in ReactJS
- 26. caching dei dati per ogni richiesta in applicazione Owin
- 27. Messaggi registro raccolta dati obsoleti
- 28. dimensione dei dati di query scitkit-imparare deve corrispondere la dimensione dei dati formazione
- 29. ERRORE: deve implementare OnFragmentInteractionListener
- 30. fa ogni S4 deve essere generico
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
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). –
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. –