未使用のコードを見つける[終了]


208

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




これがオフトピックとしてラベル付けされていることに驚いています。質問が作成されてから11年後に、質問と回答は役に立ちました。提供されたトピック外のリンクは、「...プログラマーが一般的に使用するソフトウェアツールであり、...」はSO!に明確に関連していると述べています。
シェルペペレイラ

回答:


218

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


20
これは素晴らしい。これについて十分な人々が知りません。すべてを表示するには、Solution Wide Analysisもオンにする必要があります。
mcintyre321 2010

16
Resharperは優れたツールですが、このタスクでは信頼できないことがわかりました。すべての参照を削除したパブリックメソッドがあります。メソッドを右クリックして[使用法を表示]を選択すると、何もありませんが、Resharperのコードの問題では、未使用としてリストされません。
user890155 2011

9
依存性注入を使用しています。その結果、未使用のタイプでもUnityに登録されているため、すべてが再シャープ化されているように見えます。
モンゴメリー 'monty'ジョーンズ

11
@ user890155メソッドがパブリックであるため、ライブラリは現在のソリューションにない別のアプリケーションによって消費される可能性があります。未使用の場合、内部およびプライベートメソッドにコードの問題としてのみフラグを立てると思います。
Lukazoid

3
@elggarc依存関係注入については、ここで言及されているエージェントマルダープラグインをご覧ください。blogs.jetbrains.com / dotnet / 2012/08 / resharper - 70 - plug - insプロジェクトホームページ:hmemcpy.github.com/AgentMulderエージェントマルダー—サポートAutofac、Castle Windsor、Unityなどの依存性注入フレームワーク。ReSharperはこれらのコンテナーを認識しないため、クラスが未使用としてマークされたり、インスタンス化されないことがよくあります。エージェントモルダーは、これらのクラスが使用されているときにReSharperに通知し、各クラスから登録ポイントへのナビゲーションを提供します。
Grzegorz Smulko 2013年

29

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

素晴らしいツールが思い浮かびます:

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

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


4
アプリがasp.netであり、NDependを使用している場合は、別の注意点として、コードビハインドを分析できるようにサイトをプリコンパイルする必要があり、NDependはaspxページからの呼び出し(つまり、ObjectDataSourcesおよびのように)
ハイメ

16

他の人が述べているように、Resharperはこれに適しています。ただし、これらのツールでは、リフレクションで使用されているコードが見つからないため、リフレクションで使用されていないコードがあるかどうかを確認できません。


15

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

少し詳しく説明すると、NDependはLINQクエリ(CQLinq)を介したコードルールを記述することを提案しています。約200のデフォルトコードルールが提案され、そのうち3つは未使用/デッドコード検出専用です

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

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

未使用のメソッド(デッドメソッド)を見つけるためのNDependルール

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

NDependはVisual Studio 2017、2015、2013、2012、2010に統合されているため、これらのルールはIDE内で直接確認/参照/編集できます。このツールはCIプロセスに統合することもでき、違反したルールや原因のコード要素を示すレポートを作成できます。NDependには、VS Team Services拡張機能もあります

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

これは静的分析であるため、ルール名の潜在的なプレフィックスです。コード要素がリフレクションを通じてのみ使用される場合、これらのルールはそれを未使用と見なす可能性がありますが、そうではありません。

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

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


6

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


4

ReSharperは、未使用のコードを見つけるのに優れています。

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


1

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

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

そのようなツールの1つがNCoverでありSourceforgeにオープンソースの前駆体があります。別の代替手段はPartCoverです。

Stackoverflowでこの回答を確認してください。


1

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.