簡単に言えば、オブジェクトが別の場所で破棄されていることを示唆する方法はありません。
リフレクター処理 (または dotPeek 処理など) を少し行うと、その理由が説明されます。
FxCop が入っていC:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCopます。(お使いの OS/VS バージョンの組み合わせに応じて調整してください。) ルールはRulesサブディレクトリにあります。
メインFxCopフォルダーで、開く
Microsoft.VisualStudio.CodeAnalysis.dll
Microsoft.VisualStudio.CodeAnalysis.Phoenix.dll
phx.dll
Rulesフォルダで、を開きDataflowRules.dllます。
DataflowRules.dll検索でPhoenix.CodeAnalysis.DataflowRules.DisposeObjectsBeforeLosingScope。それが評価を行う実際のクラスです。
そこにあるコードを見ると、質問に関して興味深いことが 2 つあります。
- という共有サービス
SharedNeedsDisposedAnalysisを利用しています。
- に由来し
FunctionBodyRuleます。
最初の項目は、SharedNeedsDisposedAnalysisどのシンボルをDispose()呼び出す必要があるかを決定するものであるため、興味深いものです。コードを「ウォークスルー」して、何を破棄する必要があり、何を実際に破棄するかを決定します。次に、後で使用するためにそれらのテーブルを保持します。
FunctionBodyRuleルールは単一の関数の本体を評価するため、2 番目の項目は興味深いものです。FunctionCallRule関数呼び出しメンバー (例: ) のようなものを評価するような、他のルール タイプがありますProvideCorrectArgumentsToFormattingMethods。
SharedNeedsDisposedAnalysisポイントは、メソッドを再帰して実際に破棄されていることを確認するサービスの潜在的な「ミス」とFunctionBodyRule、関数本体を超えないという制限の間で、拡張機能をキャッチしていないということです。
これは、使用する前に引数を検証していると見なされないような「ガード関数」と同じ理由Guard.Against<ArgumentNullException>(arg)です.FxCopは、「ガード関数」が行っていることであっても、引数のnullをチェックするように指示します.
基本的に 2 つのオプションがあります。
- 問題を除外するか、ルールをオフにします。思い通りになるわけがありません。
- 拡張メソッドを理解するカスタム/派生ルールを作成します。デフォルト ルールの代わりにカスタム ルールを使用します。
カスタムの FxCop ルールを自分で作成した後、それを発見したことをお知らせします...自明ではありません。その道をたどる場合、世界中で推奨されているのは新しい Phoenix エンジン ルール スタイルを使用することですが (これが現在DisposeObjectsBeforeLosingScope使用されているものです)、古い/標準の FxCop SDK ルールを理解する方が簡単であることがわかりました (FxCopSdk.dllメインのFxCop フォルダー)。Reflector は、ドキュメントがほとんどないため、その方法を理解するのに非常に役立ちます。Rulesフォルダー内の他のアセンブリを調べて、それらの例を確認してください。