2009-03-08 3 views
8

Esiste uno strumento in grado di eseguire la scansione del codice e determinare quali oggetti che implementano IDisposable non vengono disposti in un codebase in fase di compilazione o in fase di esecuzione?Tracciamento non esposto Oggetti monouso

Possiedo aree nel codice che non dispongono di oggetti ma è difficile guardare indietro e vedere quali oggetti richiedono questo in primo luogo.

risposta

8

C'è un sacco di strumenti di analisi statica, che possono aiutare qui.

Entrambi CodeRush/Refactor Pro e Resharper mostreranno, al momento del codice, in Visual Studio, oggetti non esposti.

E FxCop, ora impacchettato come parte di Code Analysis di Visual Studio, può generare avvisi di tempo di compilazione per locals e membri della classe non esposti.

+1

+1, ma quanto è affidabile? –

+0

Considererò questa la risposta dopo aver provato Resharper e questi altri strumenti. Mi piacerebbe mantenere aperta questa domanda per ottenere più idee, ma apprezzo la risposta. +1 per te. –

+0

Come/dove viene mostrato Resharper? –

-1

Il distruttore di una classe viene chiamato quando il garbage collector pulisce finalmente le classi che non sono più in uso. Quello che potresti fare è mettere un check nel distruttore che è stato chiamato "Dispose". Si sconsiglia di utilizzare effettivamente il distruttore, ma a scopo di test può essere utile.

L'unico problema con questo metodo è che sarà necessario creare la propria classe che eredita da quella che è necessario testare per IDispose e sovrascrivere il metodo Dispose (in modo da poter impostare una bandiera dicendo che è stata chiamata) , inizializzare il flag in un costruttore e controllarlo nel distruttore (che si implementa con "~ ClassName() {...}")

+1

Qualcuno potrebbe commentare perché questa risposta è stata downvoted? È inaffidabile? – Eric

+0

Questa non è necessariamente un'ottima soluzione (è necessario aggiungere i finalizzatori agli oggetti esclusivamente ai fini del testing), ma non penso che dovrebbe essere downvoted. Esistono precedenti per l'utilizzo dei finalizzatori per facilitare il debug, ad esempio il modo in cui le attività TPL generano eccezioni non gestite nel finalizzatore se l'eccezione non è mai stata osservata in un contesto più controllato. –

+0

@DanBryant In aggiunta a ciò, implementare i finalizzatori ha l'effetto collaterale degli oggetti che sopravvivono ad almeno un round di GC, il che può influire negativamente sulle prestazioni. – aevitas

3

Lo strumento ANTS memory profiler da red-gate sarà utile in fase di runtime. È uno dei miei strumenti preferiti.