web-dev-qa-db-ja.com

Visual Studioで未使用のコードを削除する

この質問に関連して: " 未使用の参照を削除(!="使用 ") "、Visual Studioから未使用のクラス、構造体、デリゲートなどを削除するツールがあるかどうかを知りたい解決。

シナリオ:

私は何千もので構成された未編成のVisual Studioソリューションを持っています:

  • ネイティブメソッドのインポート
  • 構造
  • デリゲート
  • 列挙

[すべての参照を検索]をクリックして各ファイルを検索し、コードがどこかで使用されているかどうかを判断するのではなく、冗長なコードファイルを簡単に削除できるメカニズムはありますか?

例:

//This class contains a method called getRandomValue which returns type RANDOM
public class NativeMethods
{
    [DllImport("random.dll")]
    public static extern RANDOM getRandomValue();
}

//This is the RANDOM object as referenced by getRandomValue();
[StructLayout(LayoutKind.Sequential)]
public struct RANDOM
{
    uint a;
    uint b;
    uint c;
}

//This is redundant since nothing is referencing it.
[StructLayout(LayoutKind.Sequential)]
public struct MESSAGE
{
    IntPtr sender;
    IntPtr recipient;
    char[] mText;
}

自分への注意:

私の直感では、Javaとは異なり、オブジェクト名はファイル名と同じである必要はなく、複数のオブジェクト宣言を単一のファイル内に置くことができるため、これはトリッキーになりますが、このインスタンス(私のシナリオ)ではすべてのオブジェクトが独自のファイル内で(同じ名前で)宣言されています。

30
series0ne

ReSharperは、コードをクリーンアップするための最良の選択です。

ReSharper Early Access Program のおかげで無料で使用できます。

enter image description here

17
Dmitry Khryukin

これを行うために使用できるツールがいくつかあります。

FxCopは未使用の内部コードとプライベートコードのみを検出します。もちろん、アセンブリの外部からアクセスする必要があるコードのみを公開するようにすれば、それで十分です。

12
Ergwun

@Ergwunが指摘したように、ツール 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で働いています。