web-dev-qa-db-de.com

Nicht verwendeten Code in Visual Studio entfernen

In Bezug auf diese Frage: " Entfernen Sie nicht verwendete Verweise (! =" Using ") ". Ich würde gerne wissen, ob es ein Tool zum Entfernen nicht verwendeter Klassen, Strukturen, Delegaten usw. aus einer Visual Studio-Lösung gibt.

Szenario:

Ich habe eine nicht organisierte Visual Studio-Lösung, die aus Tausenden besteht:

  • Native Methodenimporte 
  • Strukturen 
  • Delegierte
  • Aufzählungen

Anstatt durch jede Datei zu blättern, indem Sie auf "Alle Verweise suchen" klicken und feststellen, ob der Code irgendwo verwendet wird, gibt es einen Mechanismus, durch den ich redundante Codedateien einfach entfernen kann?

Beispiel:

//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;
}

Notiz an mich selbst:

Mein Gefühl ist, dass dies schwierig sein wird, da im Gegensatz zu Java Objektnamen nicht mit dem Dateinamen identisch sein müssen. Mehrere Objektdeklarationen können sich in einer einzigen Datei befinden, in diesem Fall (in meinem Szenario) ist jedoch jedes Objekt in seiner eigenen Datei (mit identischem Namen) deklariert.

30
series0ne

ReSharper ist die beste Wahl, um Ihren Code zu bereinigen.

Sie können es dank ReSharper Early Access Program kostenlos nutzen.

enter image description here

15
Dmitry Khryukin

Es gibt verschiedene Tools, die Sie dazu verwenden können:

FxCop findet nur ungenutzten internen und privaten Code. Wenn Sie sicherstellen, dass Sie nur Code öffentlich verfügbar machen, der außerhalb Ihrer Assembly zugänglich sein muss, dann sollte dies gut genug sein.

12
Ergwun

Wie @Ergwun erwähnt, kann das Tool NDepend helfen, nicht verwendete Methoden, Felder und Typen zu finden. 

Um ein wenig näher darauf einzugehen, schlägt NDepend vor, Code-Regel über LINQ-Abfrage (CQLinq) zu schreiben. Es werden etwa 200 Standard-Code-Regeln vorgeschlagen, von denen drei für die Erkennung von unbenutzter/toter Code vorgesehen sind

Grundsätzlich sieht eine solche Regel zum Erkennen nicht verwendeter Methoden beispielsweise so aus:

// <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)

Diese Regel ist jedoch naiv und führt zu unbedeutenden Fehlalarmen. Es gibt viele Situationen, in denen eine Methode nie aufgerufen wird, jedoch nicht verwendet wird (Einstiegspunkt, Klassenkonstruktor, Finalisierer ...). Deshalb werden die 3 Standardregeln genauer beschrieben:

NDepend ist in Visual Studio 2017, 2015, 2012, 2010 integriert. Daher können diese Regeln überprüft/durchsucht/bearbeitet/bearbeitet werden) direkt in IDE }. Das Tool kann auch in Ihren CI-Prozess integriert werden, und es kann Berichte erstellt werden, die die Regeln enthalten, gegen die verstoßen wird, und die dazugehörigen Codeelemente. NDepend hat auch eine VS Team Services-Erweiterung .

Wenn Sie auf diese drei Links in Richtung des Quellcodes dieser Regeln klicken, werden Sie feststellen, dass die Verknüpfungen zu Typen und Methoden etwas komplex sind. Dies liegt daran, dass sie nicht nur nicht verwendete Typen und Methoden erkennen, sondern auch Typen und Methoden, die only von nicht verwendeten Dead-Typen und -Methoden (rekursiv) verwendet werden.

Dies ist static analysis, daher das Präfix Potential in den Regelnamen. Wenn ein Code-Element only durch Reflektion verwendet wird, kann es von diesen Regeln als nicht verwendet betrachtet werden. Dies ist jedoch nicht der Fall. 

Zusätzlich zu diesen 3 Regeln würde ich empfehlen, die Codeabdeckung durch Tests zu messen und eine vollständige Abdeckung zu erreichen. Oft sehen Sie, dass Code, der nicht durch Tests abgedeckt werden kann, tatsächlich ungenutzter/toter - Code ist, der sicher verworfen werden kann. Dies ist besonders nützlich bei komplexen Algorithmen, bei denen nicht klar ist, ob ein Codezweig erreichbar ist oder nicht.

Disclaimer: Ich arbeite für NDepend.