Obtenir la liste des codes de référence zéro dans Visual Studio

133

Dans Visual Studio 2013, le nombre de références d'un Code spécial (méthode, propriété, champ, ...) est indiqué par Code Lens . Je veux obtenir des codes inutilisés (aucune référence) dans Visual Studio. Y a-t-il un moyen de les obtenir?

Je veux dire ci-dessous référence:

entrez la description de l'image ici

Nima Rostami
la source
7
Je pense qu'il veut une liste de toutes les méthodes qui ne sont pas référencées, plutôt que de ramener à zéro le nombre de références de cette méthode particulière.
Jurgen Camilleri
1
Si vous ne voulez trouver des références inutilisées, vous trouverez un grand nombre de questions en double. Google juste pour "c # trouver le code non utilisé"
Panagiotis Kanavos
1
oui je veux trouver que tous les codes inutilisés contiennent des méthodes, des propriétés, etc.
Nima Rostami
1
N'oubliez pas que vous ne pouvez pas être sûr que a publicest inutilisé sans rechercher toute la base de code. Cependant, pour les composants internes et privés inutilisés, l'analyse du code vous avertira si vous avez activé l'avertissement approprié.
Matthew Watson
2
Des années plus tard, la capture d'écran continue d'être trompeuse.
Sinjai

Réponses:

184

Le moyen le meilleur et le plus simple d'atteindre ce que vous recherchez est probablement d'utiliser l'outil d'analyse de code intégré avec Visual Studio pour rechercher et vous diriger directement vers le code mort et les membres inutilisés.

À cet effet, j'ai créé un nouveau fichier de jeu de règles d'analyse de code (via Fichier-> Nouveau-> Fichier , en m'assurant que Général dans le volet de gauche était sélectionné et en faisant défiler vers le bas pour trouver le jeu de règles d'analyse de code , en lui donnant un nom de fichier, puis en recherchant et sélection des règles ci-dessous). Voir ci-dessous pour le contenu du fichier d'ensemble de règles que vous pouvez copier et coller dans un nouveau fichier avec l'extension .ruleset à utiliser.

Étant donné un fichier de jeu de règles, vous pouvez cliquer avec le bouton droit sur un fichier de projet dans le panneau Explorateur de solutions et sélectionner Propriétés . Dans les fenêtres des propriétés du projet, cliquez sur l' onglet Analyse du code dans le panneau de gauche, puis cliquez sur Ouvrir pour accéder à l'emplacement du fichier .ruleset. Si vous accédez aux propriétés d'un fichier de solution (par opposition à un fichier de projet), vous pouvez définir le fichier d'analyse de code pour chaque projet de la solution en un seul endroit (sous Paramètres d'analyse du code , et en utilisant le menu déroulant pour sélectionner REMARQUE: vous devez avoir préalablement parcouru le fichier de jeu de règles pour qu'il apparaisse dans la liste déroulante de cette fenêtre de propriétés).

Ensuite, vous exécutez simplement l'analyse de code sur les projets / solution (via Analyser-> Exécuter l'analyse de code sur la solution -OU- Alt + F11 ) et il reviendra sous forme d'avertissements, de toutes les méthodes non référencées ou des membres inutilisés qu'il trouve. Il trouvera même des méthodes référencées par une méthode, qui elle-même n'a aucune référence ailleurs.

Attention cependant, comme l'une des façons dont l'analyse de code pour le code mort peut vous induire en erreur, c'est si la référence est «cachée» en n'appelant jamais la méthode que via des délégués, et bien sûr, par réflexion.

Les règles pour détecter le code mort, en particulier, sont:

  • Méthodes privées qui ne sont appelées à partir d'aucun autre code (CA1811)
  • Variables locales inutilisées (CA1804)
  • Champs privés inutilisés (CA1823)
  • Paramètres inutilisés (CA1801)
  • Classes internes qui ne sont instanciées à partir d'aucun autre code (CA1812).
  • Code mort dans un commutateur limité OU bit à bit (C6259)

Vous trouverez ci-dessous le contenu du fichier .ruleset qui peut être obtenu en suivant les étapes ci-dessus, pour votre commodité. Vous pouvez simplement copier le XML ci-dessous, le coller dans notepad ++, enregistrer quelque part avec l'extension .ruleset , rechercher et utiliser comme expliqué ci-dessus:

<?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
la source
30
Je ne pense pas que cela réponde complètement à la question. La principale différence est que CodeLens vous indiquera qu'une méthode PUBLIC n'a aucune référence dans une solution entière. C'est la clé. FxCop, R # et votre méthode pour tout ce qui n'est pas public.
Scott Wylie
1
@ScottWylie - Je ne suis pas d'accord. J'ai juste essayé la solution ci-dessus et elle n'a pas signalé les méthodes publiques non référencées. CodeLens était exceptionnel pour signaler le code mort, les éléments locaux non référencés et les variables inutilisées. Je pense que la plupart des gens obtiennent exactement ce qu'ils veulent sans utiliser un outil tiers.
mike
7
@mike Considérez ceci: Si vous voulez trouver du code mort avec une opération de masse, vous avez tendance à ne pas vous soucier des membres privés / protégés, car ce sont des problèmes locaux. Par exemple, je migre un projet de 500 000+ LoC avec plus de 100 projets et plus de 10 solutions vers une architecture de modèles de référentiel. Après avoir migré un composant, j'ai besoin de savoir quelles anciennes interfaces je peux supprimer. Certains IDE comme Eclipse ont des outils pour exactement cela. Les méthodes locales grisées ne sont tout simplement pas ma préoccupation, je voudrais une liste de classes / interfaces PUBLIC où la lentille de code me dirait "0".
Oliver Schimmer
0

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

«Malheureusement, [dans Visual Studio Analysis] vous ne pouvez détecter que les membres privés inutilisés. En effet, l'analyseur de code suppose que les membres publics peuvent être utilisés par d'autres programmes. Cela peut être vrai si vous les publiez en tant qu'API via un service Web ou la publication de votre code en tant que bibliothèque. ... ReSharper a des fonctions d'analyse de code similaires - avec l'avantage de vérifier les membres publics inutilisés. "

V Frenkel
la source
0

Je parcourais chaque fichier, exécutais la commande Ctrl-MO pour tout réduire, puis faisais défiler à la recherche de la référence 0.

user1730026
la source
-1

Voici un moyen manuel d'accomplir cela que j'ai utilisé pour trouver les classes inutilisées qui sont marquées comme publiques.

  1. Recherchez et remplacez toute «classe publique» par «classe privée» pour un projet de votre solution. Peut également avoir besoin de remplacer "public static class" et / ou "public abstract class".
  2. Construire pour trouver toutes les erreurs
  3. Pour chaque erreur de la génération, utilisez votre contrôle de code source pour restaurer le fichier de la classe référencée.
  4. Répétez pour chaque erreur jusqu'à ce que la génération réussisse.
  5. Tous les fichiers restants qui n'ont pas été restaurés sont probablement des candidats à la suppression.
  6. (facultatif) Renommez les classes dans les fichiers ci-dessus et effectuez une compilation supplémentaire pour trouver les erreurs.
  7. Faites une dernière recherche du nom de la classe que vous souhaitez supprimer pour confirmer qu'aucune instance de celle-ci n'est utilisée dans la réflexion ou les chaînes magiques.
  8. Supprimez les fichiers de classe inutilisés identifiés.
  9. Répétez pour chaque projet de solution que vous souhaitez nettoyer.

Remarque: si vous ne suivez pas la règle d'une classe par fichier, cela nécessitera beaucoup plus de travail. En outre, pour tous les points de terminaison de service d'API, vous devrez vérifier qu'il n'est utilisé par aucun projet externe.

Ulfius
la source
14
Ce n'est pas du tout pratique.
Don Rolling
1
Cela fonctionne pour moi dans un grand projet et c'est une solution. Les cas peuvent varier là où c'est plus difficile, mais je voulais offrir cela comme une possibilité.
Ulfius