Liste der Nullreferenzcodes in Visual Studio abrufen

133

In Visual Studio 2013 wird die Anzahl der Referenzen eines speziellen Codes (Methode, Eigenschaft, Feld, ...) von Code Lens angezeigt . Ich möchte unbenutzte Codes (ohne Referenz) in Visual Studio erhalten. Gibt es eine Möglichkeit, sie zu bekommen?

Ich meine unten Referenz:

Geben Sie hier die Bildbeschreibung ein

Nima Rostami
quelle
7
Ich denke, er möchte eine Liste aller Methoden, auf die nicht verwiesen wird, anstatt die Anzahl der Referenzen dieser bestimmten Methode auf Null zu bringen.
Jürgen Camilleri
1
Wenn Sie noch nicht verwendete Referenzen finden wollen, finden Sie eine finden Menge von doppelten Fragen. Google einfach nach "c # find
unused
1
Ja, ich möchte feststellen, dass alle nicht verwendeten Codes Methoden, Eigenschaften usw. enthalten.
Nima Rostami
1
Denken Sie daran, dass Sie nicht sicher sein können, dass a publicnicht verwendet wird, ohne die gesamte Codebasis zu durchsuchen. Bei nicht verwendeten Interna und Privaten werden Sie von Code Analysis jedoch gewarnt, wenn Sie die entsprechende Warnung aktiviert haben.
Matthew Watson
2
Jahre später ist der Screenshot weiterhin irreführend.
Sinjai

Antworten:

184

Der wahrscheinlich beste und einfachste Weg, um das zu erreichen, wonach Sie suchen, ist die Verwendung des integrierten Code-Analyse-Tools in Visual Studio, um Sie zu finden und direkt zu totem Code und nicht verwendeten Mitgliedern zu führen.

Zu diesem Zweck habe ich eine neue Code - Analyse ruleset Datei (Via File-> New-> Datei , um sicherzustellen , Allgemein im linken Bereich ausgewählt wurde und nach unten scrollen finden Code - Analyse - Regelsatz , es einen Dateinamen geben, dann für die Suche und Auswahl der folgenden Regeln). Im Folgenden finden Sie den Inhalt der Regelsatzdatei, die Sie kopieren und in eine neue Datei mit der zu verwendenden Erweiterung .ruleset einfügen können.

Bei einer Regelsatzdatei können Sie im Projektmappen- Explorer mit der rechten Maustaste auf eine Projektdatei klicken und Eigenschaften auswählen . Klicken Sie in den Fenstern der Projekteigenschaften im linken Bereich auf die Registerkarte Code-Analyse und dann auf Öffnen , um zum Speicherort der .ruleset-Datei zu navigieren. Wenn Sie zu den Eigenschaften einer Lösungsdatei wechseln (im Gegensatz zu einer Projektdatei), können Sie die Code-Analysedatei für jedes Projekt in der Lösung an einem Ort festlegen (unter Code-Analyse-Einstellungen und über das dortige Dropdown-Menü auswählen) HINWEIS: Sie müssen zuvor die Regelsatzdatei durchsucht haben, damit sie in der Dropdown-Liste in diesem Eigenschaftenfenster angezeigt wird.

Anschließend führen Sie einfach die Codeanalyse für die Projekte / Lösungen aus (über Analyse-> Codeanalyse für Lösung ausführen -OR- Alt + F11 ) und sie wird als Warnungen, nicht referenzierte Methoden oder nicht verwendete gefundene Mitglieder zurückgegeben. Es werden sogar Methoden gefunden, auf die von einer Methode verwiesen wird, auf die selbst an keiner anderen Stelle verwiesen wird.

Seien Sie jedoch vorsichtig, da eine der Möglichkeiten der Codeanalyse für toten Code Sie falsch steuern kann, wenn die Referenz "verborgen" ist, indem die Methode immer nur über Delegaten aufgerufen wird, und natürlich durch Reflektion.

Die Regeln zum Erkennen von totem Code lauten insbesondere:

  • Private Methoden, die von keinem anderen Code aufgerufen werden (CA1811)
  • Nicht verwendete lokale Variablen (CA1804)
  • Nicht verwendete private Felder (CA1823)
  • Nicht verwendete Parameter (CA1801)
  • Interne Klassen, die von keinem anderen Code instanziiert werden (CA1812).
  • Toter Code im bitweisen ODER-begrenzten Schalter (C6259)

Nachfolgend finden Sie den Inhalt der .ruleset-Datei, die Sie zur Vereinfachung der oben genannten Schritte abrufen können. Sie können das folgende XML einfach kopieren, in Notepad ++ einfügen , mit der Erweiterung .ruleset irgendwo speichern , wie oben beschrieben suchen und verwenden:

<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Dead Code Rules" Description=" " ToolsVersion="12.0">
  <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
    <Rule Id="CA1801" Action="Warning" />
    <Rule Id="CA1804" Action="Warning" />
    <Rule Id="CA1811" Action="Warning" />
    <Rule Id="CA1812" Action="Warning" />
    <Rule Id="CA1823" Action="Warning" />
  </Rules>
  <Rules AnalyzerId="Microsoft.Analyzers.NativeCodeAnalysis" RuleNamespace="Microsoft.Rules.Native">
    <Rule Id="C6259" Action="Warning" />
  </Rules>
</RuleSet>
Adam White
quelle
30
Ich denke nicht, dass dies die Frage vollständig beantwortet. Der Hauptunterschied besteht darin, dass CodeLens Ihnen mitteilt, dass eine PUBLIC-Methode in einer gesamten Lösung keine Referenzen enthält. Das ist der Schlüssel. FxCop, R # und Ihre Methode eignen sich hervorragend für alles, was nicht öffentlich ist.
Scott Wylie
1
@ ScottWylie - Ich bin anderer Meinung. Ich habe gerade die obige Lösung ausprobiert und sie hat keine nicht referenzierten öffentlichen Methoden markiert. CodeLens war außergewöhnlich darin, toten Code, nicht referenziertes lokales Material und nicht verwendete Variablen zu kennzeichnen. Ich denke, dies bringt den meisten Menschen genau das, was sie wollen, ohne ein Tool eines Drittanbieters zu verwenden.
Mike
7
@mike Bedenken Sie Folgendes: Wenn Sie toten Code mit einer Massenoperation finden möchten, interessieren Sie sich normalerweise nicht für private / geschützte Mitglieder, da dies lokale Probleme sind. Zum Beispiel migriere ich ein 500k + LoC-Projekt mit mehr als 100 Projekten und mehr als 10 Lösungen in eine Repository-Musterarchitektur. Nach der Migration einer Komponente muss ich wissen, welche alten Schnittstellen ich löschen kann. Einige IDEs wie Eclipse haben Tools dafür. Ausgegraute lokale Methoden sind einfach nicht mein Anliegen. Ich hätte gerne eine Liste von PUBLIC-Klassen / -Schnittstellen, bei denen die Code-Linse mir "0" sagen würde.
Oliver Schimmer
0

https://scottlilly.com/c-code-quality-improvement/remove-unused-classes-properties-and-functions/

"Leider können Sie [in Visual Studio Analysis] nur nicht verwendete private Mitglieder erkennen. Dies liegt daran, dass der Code Analyzer davon ausgeht, dass öffentliche Mitglieder möglicherweise von anderen Programmen verwendet werden. Dies kann zutreffen, wenn Sie sie als API über einen Webdienst veröffentlichen oder geben Sie Ihren Code als Bibliothek frei. ... ReSharper verfügt über ähnliche Code-Analysefunktionen - mit dem Vorteil, nach nicht verwendeten öffentlichen Mitgliedern zu suchen. "

V Frenkel
quelle
0

Ich würde jede Datei durchgehen, den Befehl Strg-MO ausführen, um alles zu reduzieren, und dann nach der Referenz 0 suchen.

user1730026
quelle
-1

Hier ist eine manuelle Methode, um dies zu erreichen, mit der ich nicht verwendete Klassen gefunden habe, die als öffentlich gekennzeichnet sind.

  1. Suchen und ersetzen Sie alle "öffentlichen Klassen" durch "private Klassen" für ein Projekt in Ihrer Lösung. Möglicherweise müssen auch "öffentliche statische Klasse" und / oder "öffentliche abstrakte Klasse" ersetzt werden.
  2. Erstellen Sie, um alle Fehler zu finden
  3. Verwenden Sie für jeden Fehler im Build Ihre Quellcodeverwaltung, um die Datei für die referenzierte Klasse wiederherzustellen.
  4. Wiederholen Sie diesen Vorgang für jeden Fehler, bis der Build erfolgreich ist.
  5. Alle verbleibenden Dateien, die nicht wiederhergestellt wurden, können entfernt werden.
  6. (optional) Benennen Sie die Klassen in den obigen Dateien um und führen Sie einen weiteren Build durch, um Fehler zu finden.
  7. Führen Sie eine letzte Suche nach dem Namen der Klasse durch, die Sie entfernen möchten, um zu bestätigen, dass keine Instanzen davon in Reflexions- oder magischen Zeichenfolgen verwendet werden.
  8. Entfernen Sie die identifizierten nicht verwendeten Klassendateien.
  9. Wiederholen Sie diesen Vorgang für jedes Lösungsprojekt, das Sie bereinigen möchten.

Hinweis: Wenn Sie die Regel "Eine Klasse pro Datei" nicht befolgen, ist viel mehr Arbeit erforderlich. Außerdem müssen Sie bei allen API-Service-Endpunkten überprüfen, ob sie nicht von externen Projekten verwendet werden.

Ulfius
quelle
14
Das ist überhaupt nicht praktisch.
Don Rolling
1
Es funktioniert für mich in einem großen Projekt und ist eine Lösung. Fälle können variieren, wo es schwieriger ist, aber ich wollte dies als eine Möglichkeit bieten.
Ulfius