Ci sono molte domande, quindi, che si chiede come rilevare la perdita di oggetti IDisposable. Sembra che la risposta sia "you can't".Rilevamento di oggetti identificabili "fuoriusciti"
Ho appena controllato con il caso di test più banale, che FxCop 10.0 non lo fa, ReSharper 4 con MSVS2010 non lo fa.
Questo mi sembra sbagliato, peggio di perdite di memoria in C (per il quale almeno abbiamo stabilito strumenti per rilevare).
Stavo pensando: è possibile, utilizzando la riflessione e altre tecniche avanzate oscure, che posso iniettare un controllo in fase di esecuzione, nel finalizzatore per vedere se è stato chiamato Dispose
?
E i trucchi magici con WinDBG + SOS?
Anche se non ci sono strumenti esistenti per farlo, mi piacerebbe sapere se questo è teoricamente possibile (il mio C# non è molto nitido).
Idee?
NOTA Il titolo di questa domanda potrebbe essere fuorviante. La vera domanda qui dovrebbe essere se un oggetto IDisposable
è stato Disposed()
correttamente. Ottenere smaltito dal GC non conta perché lo considero un errore.
Modifica: Soluzione: .NET Memory Profiler fa il lavoro. Abbiamo solo bisogno di inviare spam diversi GC.Collect()
alla fine del programma per consentire al nostro profiler di raccogliere correttamente le statistiche.
Il motivo per cui esistono strumenti per C++ ma forse non per C# è che le risorse in C# sono fondamentalmente diverse poiché le risorse non gestite sono * non più abbinate alla durata dell'oggetto *. Ciò che può essere tracciato, sia in C# che in C++, è la durata dell'oggetto e se un oggetto è stato correttamente eliminato. Ma le risorse usa e getta in C# non sono in alcun modo vincolate alla durata dell'oggetto, il che rende molto più difficile rintracciarle. Per fare un confronto, prova a tenere traccia delle risorse GDI trapelate che non sono collegate tramite RAII alla durata dell'oggetto in C++. Neanche così facile. –
Ho riflettuto un po 'su questo. Ho sviluppato l'abitudine di controllare rapidamente i tipi mentre scrivo codice per vedere se ereditano da 'IDisposable'. Se lo fanno, li avvolgo in "uso" dello scopo di cui hanno bisogno per vivere. Non fa nulla per il codice esistente ma ho solo pensato di parlarne. –
Dai un'occhiata a questo post in cui puoi utilizzare l'analisi del codice di Visual Studio per rilevare problemi di iDisposable in fase di compilazione: http://stackoverflow.com/a/6213977/2862 –