La risposta breve è: non c'è modo di accennare che l'oggetto è in via di dismissione altrove.
Un po 'di Reflector-ing (o dotPeeking, o qualsiasi altra cosa) spiega perché.
FxCop è in C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop
. (Regolare di conseguenza per la combinazione della versione OS/VS.) Le regole sono nella sottodirectory Rules
.
Nella principale FxCop
cartella, aperto
Microsoft.VisualStudio.CodeAnalysis.dll
Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll
phx.dll
Nella cartella di Rules
, aperto DataflowRules.dll
.
In DataflowRules.dll
trovare Phoenix.CodeAnalysis.DataflowRules.DisposeObjectsBeforeLosingScope
. Questa è la classe reale che fa la valutazione.
Guardando il codice lì dentro, puoi vedere due cose di interesse rispetto alla tua domanda.
- Esso utilizza un servizio condiviso chiamato
SharedNeedsDisposedAnalysis
.
- E deriva da
FunctionBodyRule
.
Il primo elemento è interessante perché SharedNeedsDisposedAnalysis
è quello che determina quali simboli devono Dispose()
chiamato. È piuttosto accurato, facendo una "passeggiata" attraverso il codice per determinare cosa deve essere smaltito e cosa viene effettivamente eliminato. Quindi mantiene un tavolo di quelle cose per un uso successivo.
Il secondo elemento è interessante perché le regole FunctionBodyRule
valutano il corpo di una singola funzione. Esistono altri tipi di regole, ad esempio FunctionCallRule
, che valutano elementi come i membri di una chiamata di funzione (ad esempio, ProvideCorrectArgumentsToFormattingMethods
).
il punto è, tra il potenziale "miss" in quel SharedNeedsDisposedAnalysis
servizio in cui esso non può essere recursing attraverso il metodo di vedere che le cose in realtà sono sempre disposti e la limitazione di FunctionBodyRule
comunque non oltre il corpo della funzione, è solo non prendere la tua estensione.
Questa è la stessa ragione "Funzioni di guardia" come non arrivano mai viste come convalidare l'argomento prima di usarlo - FxCop sarà ancora dirvi di controllare l'argomento per nulla, anche se questo è ciò che la "funzione di guardia" sta facendo .
Hai fondamentalmente due opzioni.
- Escludi problemi o disattiva la regola. Non c'è modo che farà ciò che vuoi.
- Creare una regola personalizzata/derivata che comprenda i metodi di estensione. Usa la regola personalizzata al posto della regola predefinita.
Dopo aver personalizzato scritto FxCop mi governa, io farò sapere l'ho trovato ... non banale. Se si scende su quella strada, mentre la raccomandazione nel mondo è quella di utilizzare il nuovo stile di regola del motore Phoenix (è quello che utilizza l'attuale DisposeObjectsBeforeLosingScope
), ho trovato più facile capire le regole SDK FxCop precedenti/standard (vedere FxCopSdk.dll
in la cartella principale di FxCop). Reflector sarà di grande aiuto nel capire come farlo dato che c'è praticamente zero documenti su di esso. Cerca negli altri assembly nella cartella Rules
per vedere esempi di quelli.
È campione dice 'this.privateMember.Dispose()'. Il tuo codice in realtà dice 'this.privateMember.SafeDispose()'? –