Die kurze Antwort lautet: gibt es keine Möglichkeit, dass das Objekt anzudeuten, wird an anderer Stelle angeordnet ist.
Ein wenig Reflector-ing (oder dotPeek-ing, oder was auch immer) erklärt, warum.
FxCop ist in C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop
. (Passen Sie für Ihr OS/VS-Versionskombination entsprechend an.) Regeln befinden sich in dem Rules
-Unterverzeichnis.
Im Haupt FxCop
Ordner, offen
Microsoft.VisualStudio.CodeAnalysis.dll
Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll
phx.dll
Im Rules
Ordner, offen DataflowRules.dll
.
In DataflowRules.dll
finden Phoenix.CodeAnalysis.DataflowRules.DisposeObjectsBeforeLosingScope
. Das ist die eigentliche Klasse, die die Auswertung durchführt.
Mit Blick auf den Code dort, können Sie zwei Dinge von Interesse in Bezug auf Ihre Frage sehen.
- Es nutzt ein gemeinsamer Dienst namens
SharedNeedsDisposedAnalysis
.
- Es stammt von
FunctionBodyRule
.
Der erste Punkt ist interessant, weil SharedNeedsDisposedAnalysis
was bestimmt, welche Symbole müssen Dispose()
genannt. Es ist ziemlich gründlich, einen "Spaziergang" durch den Code zu machen, um festzustellen, was entsorgt werden muss und was tatsächlich entsorgt wird. Es hält dann eine Tabelle dieser Dinge für den späteren Gebrauch. Der zweite Artikel ist interessant, weil FunctionBodyRule
Regeln den Körper einer einzelnen Funktion bewerten. Es gibt andere Regeltypen wie FunctionCallRule
, die Dinge wie Funktionsaufruf-Mitglieder (z. B. ProvideCorrectArgumentsToFormattingMethods
) auswerten.
Der Punkt ist, zwischen dem Potential „miss“ in diesem SharedNeedsDisposedAnalysis
Dienst, wo es möglicherweise nicht durch Ihre Methode wird Rekursion, um zu sehen, dass die Dinge tatsächlich angeordnet sind immer und die Begrenzung von FunctionBodyRule
nicht über die Funktion Körper geht, es ist nur Ihre Erweiterung nicht abfangen. Diese
ist der gleiche Grund, „Guard-Funktionen“ wie nie als Validierung des Argument gesehen, bevor Sie es benutzen - FxCop werden Sie immer noch sagen, das Argument für null zu überprüfen, auch wenn das, was die „Schutzfunktion“ tut .
Sie haben grundsätzlich zwei Möglichkeiten.
- Probleme ausschließen oder die Regel deaktivieren. Es wird auf keinen Fall machen, was Sie wollen.
- Erstellen Sie eine benutzerdefinierte/abgeleitete Regel, die Erweiterungsmethoden versteht. Verwenden Sie Ihre benutzerdefinierte Regel anstelle der Standardregel.
Nach geschrieben Brauch mit FxCop selbst regiert, werde ich Sie wissen lassen, fand ich es ... nicht-triviale. Wenn Sie diesen Weg gehen, während die Empfehlung in der Welt ist, den neuen Phoenix-Engine-Regelstil zu verwenden (das ist, was der aktuelle DisposeObjectsBeforeLosingScope
verwendet), fand ich es einfacher, die älteren/Standard-FxCop SDK-Regeln zu verstehen (siehe FxCopSdk.dll
in der Hauptordner von FxCop). Reflektor wird eine große Hilfe sein, herauszufinden, wie man das macht, da es so gut wie keine Dokumentation gibt. Suchen Sie in den anderen Assemblys im Ordner Rules
nach Beispielen.
Sie Probe sagt 'this.privateMember.Dispose()'. Sagt Ihr Code tatsächlich 'this.privateMember.SafeDispose()'? –