web-dev-qa-db-ja.com

未使用のコードを見つける

大規模なC#アプリケーションをリファクタリングする必要があり、使用されていない多くの関数が見つかりました。未使用のコードをチェックして、未使用の関数をすべて削除するにはどうすればよいですか?

204
Andre

はい、ReSharperはこれを行います。ソリューションを右クリックし、[コードの問題を検索]を選択します。結果の1つは「未使用のシンボル」です。これにより、使用されていないクラス、メソッドなどが表示されます。

216
Jarrett Meyer

それは素晴らしい質問ですが、ここで危険な海域を歩いていることに注意してください。コードを削除するときは、頻繁にコンパイルおよびテストしていることを確認する必要があります。

1つの優れたツールが思い浮かびます。

NDepend-このツールは驚くばかりです。理解するのに少し時間がかかります。最初の10分後、ほとんどの開発者は「ネジを締める」と言うだけだと思います。アプリを削除します。 NDependの使い心地を理解すると、アプリがどのように結合されているかについて驚くべき洞察が得られます。それをチェックしてください: http://www.ndepend.com/ 。最も重要なことは、このツールを使用すると、直接の呼び出し元を持たないメソッドを表示できることです。また、アセンブリ内(またはアセンブリ間)のメソッドの完全な呼び出しツリーである逆も表示されます。

どのツールを選択したとしても、それは簡単に取る作業ではありません。特に、ライブラリタイプアセンブリのパブリックメソッドを処理している場合は、アプリがそれらを参照するタイミングがわからない場合があります。

28
Jeff Schumacher

他の人が述べているように、Resharperはこれに適しています。ただし、これらのツールでは、リフレクションで使用されるコードが検出されないことに注意してください。一部のコードがリフレクションによって使用されていないかどうかを知ることができません。

16
mmiika

Jeffが指摘したように、ツール NDepend は未使用のメソッド、フィールド、およびタイプを見つけるのに役立ちます。

少し詳しく説明するために、NDependは LINQクエリ(CQLinq)上のコードルール と書くことを提案しています。 200のデフォルトコードルール が提案されており、そのうち3つはunused/dead code検出専用です

基本的に、たとえば未使用のメソッドを検出するためのこのようなルールは次のようになります。

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

NDepend rule to find unused methods (dead methods)

しかし、このルールは単純であり、些細な誤検知を返します。メソッドが呼び出されることはないが未使用ではない(エントリポイント、クラスコンストラクター、ファイナライザーなど)多くの状況があります。これが、3つのデフォルトルールの詳細化の理由です。

NDependはVisual Studio 2017、2015、2013、2012、2010に統合されているため、これらのルールは IDE内で直接チェック/閲覧/編集 にできます。このツールは、CIプロセスに統合することもできます。また、 reports を作成して、違反したルールと犯人コード要素を表示できます。 NDependには VS Team Services拡張 もあります。

これらのルールのソースコードに向かって上記の3つのリンクをクリックすると、型とメソッドに関するものが少し複雑であることがわかります。これは、未使用のタイプとメソッドだけでなく、未使用のデッドタイプとメソッド(再帰)によって使用されるタイプとメソッドonlyも検出するためです。

これはstatic analysisであるため、ルール名のプレフィックスPotentiallyです。リフレクションによってコード要素が使用される場合only、これらのルールはそれを未使用と見なすことがありますが、そうではありません。

これら3つのルールを使用することに加えて、テストでコードカバレッジを測定し、完全なカバレッジを得るように努めることをお勧めします。多くの場合、テストでカバーできないコードは、実際にはunused/deadコードであり、安全に破棄できることがわかります。これは、コードの分岐が到達可能かどうかが明確でない複雑なアルゴリズムで特に役立ちます。

免責事項:私はNDependで働いています。

IOC aka Unityを使用すると、これらの評価が誤解を招く可能性があることにも言及します。私は間違っているかもしれませんが、Unityを介してインスタンス化されたいくつかの非常に重要なクラスは、ReSharperが知る限りインスタンス化されていないようです。 ReSharperの推奨事項に従えば、うんざりするでしょう!

6
Allen Marshall

ReSharper は、未使用のコードを見つけるのに最適です。

VS IDEでは、定義を右クリックして[すべての参照を検索]を選択できますが、これはソリューションレベルでのみ機能します。

4
Mitch Wheat

真実は、このツールが100%の確実な答えを決して与えることはできないということですが、カバレッジツールはお金のためにかなり良い実行を与えることができます。

包括的な単体テストスイートを使用すると、テストカバレッジツールを使用して、テスト実行中に実行されなかったコード行を正確に確認できます。コードを手動で分析する必要があります。デッドコードと思われるものを排除するか、テストカバレッジを改善するためにテストを記述します。

そのようなツールの1つに NCover があり、オープンソースの前駆体は Sourceforge にあります。別の選択肢は PartCover です。

これを確認してください answer stackoverflowで。

1
Dan

AXTools CODESMARTに出会いました。一度試してみてください。レビューセクションでコードアナライザーを使用します。他の問題とともに、無効なローカルおよびグローバル関数を一覧表示します。

1
ramu

FXCopはコードアナライザーです...未使用のコードを見つけるだけではありません。私はしばらくFXCopを使用しましたが、その推奨事項にあまりにも失われたため、アンインストールしました。

NDependはより有望な候補のように見えると思います。

0
Cyril Gupta