Obtener la lista de códigos de referencia cero en Visual Studio


133

En Visual Studio 2013, el número de referencias de un Código especial (método, propiedad, campo, ...) se muestra en Code Lens . Quiero obtener códigos no utilizados (referencia cero) en Visual Studio. ¿Hay alguna forma de conseguirlos?

Me refiero a la siguiente referencia:

ingrese la descripción de la imagen aquí


77
Creo que quiere una lista de todos los métodos a los que no se hace referencia, en lugar de reducir a cero el número de referencias de ese método en particular.
Jurgen Camilleri

1
Si no desea encontrar referencias no utilizadas, encontrará una gran cantidad de preguntas duplicadas. Solo busca en Google "c # encuentra el código no utilizado"
Panagiotis Kanavos

1
sí, quiero encontrar que todos los códigos no utilizados contienen métodos, propiedades, etc.
Nima Rostami

1
Recuerde que no puede estar seguro de que a publicno se utiliza sin buscar en toda la base de código. Sin embargo, para elementos internos y privados no utilizados, Code Analysis le avisará si tiene habilitada la advertencia adecuada.
Matthew Watson

2
Años más tarde, la captura de pantalla sigue siendo engañosa.
Sinjai

Respuestas:


184

Probablemente, la mejor y más fácil manera de lograr lo que busca es usar la herramienta de análisis de código integrada con Visual Studio para buscar y llevarlo directamente a código muerto y miembros no utilizados.

Para este efecto, creé un nuevo archivo de conjunto de reglas de análisis de código (Via File-> New-> File , asegurándome de que General en el panel izquierdo estaba seleccionado y desplazándome hacia abajo para encontrar Code Analysis Rule Set , dándole un nombre de archivo, luego buscando y seleccionando las siguientes reglas). Consulte a continuación los contenidos del archivo de conjunto de reglas que puede copiar y pegar en un nuevo archivo con la extensión .ruleset para usar.

Dado un archivo de conjunto de reglas, uno puede hacer clic derecho en un archivo de proyecto en el panel Explorador de soluciones y seleccionar Propiedades . En las ventanas de propiedades del proyecto, haga clic en la pestaña Análisis de código en el panel izquierdo y luego haga clic en Abrir para buscar la ubicación del archivo .ruleset. Si va a las propiedades de un archivo de solución (en lugar de un archivo de proyecto), puede establecer el archivo de análisis de código para cada proyecto en la solución en un lugar (en Configuración de análisis de código , y usando el menú desplegable para seleccionar NOTA: sin embargo, debe haber examinado previamente el archivo de conjunto de reglas para que aparezca en el menú desplegable de esta ventana de propiedades.

Luego, simplemente ejecute el análisis de código en los proyectos / solución (Vía Analizar-> Ejecutar análisis de código en solución -O BIEN- Alt + F11 ) y volverá como advertencias, cualquier método sin referencia o miembros no utilizados que encuentre. Incluso encontrará métodos a los que hace referencia un método, que en sí mismo no tiene referencias en otro lugar.

Sin embargo, tenga cuidado, ya que una de las formas en que el análisis de código para el código muerto puede conducirlo a un error, es si la referencia está 'oculta' al solo llamar al método a través de delegados y, por supuesto, de reflexión.

Las reglas para detectar código muerto, específicamente, son:

  • Métodos privados que no se invocan desde ningún otro código (CA1811)
  • Variables locales no utilizadas (CA1804)
  • Campos privados no utilizados (CA1823)
  • Parámetros no utilizados (CA1801)
  • Clases internas que no se instancian desde ningún otro código (CA1812).
  • Código muerto en el interruptor limitado OR-bit (C6259)

A continuación se muestra el contenido del archivo .ruleset que se puede obtener siguiendo los pasos anteriores, para su conveniencia. Simplemente puede copiar el siguiente XML, pegarlo en el bloc de notas ++, guardarlo en algún lugar con la extensión .ruleset , buscar y usar como se explicó anteriormente:

<?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>

30
No creo que esto responda completamente la pregunta. La principal diferencia es que CodeLens le dirá que un método PUBLIC tiene cero referencias en una solución completa. Esta es la clave FxCop, R # y tu método son excelentes para todo lo que no sea público.
Scott Wylie

1
@ScottWylie - No estoy de acuerdo. Acabo de probar la solución anterior y no marcó métodos públicos sin referencia. CodeLens fue excepcional al marcar código muerto, material local sin referencia y variables no utilizadas. Creo que esto le da a la mayoría de las personas exactamente lo que quieren sin usar una herramienta de terceros.
Mike

77
@mike Considere esto: si desea encontrar un código muerto con una operación masiva, tiende a no preocuparse por los miembros privados / protegidos, porque estos son problemas locales. Por ejemplo, estoy migrando un proyecto LoC de 500k + con más de 100 proyectos y más de 10 soluciones a una arquitectura de patrones de repositorio. Después de migrar un componente, necesito saber qué interfaces antiguas puedo eliminar. Algunos IDEs como Eclipse tienen herramientas para exactamente eso. Los métodos locales atenuados simplemente no son de mi incumbencia, me gustaría una lista de clases / interfaces PÚBLICAS donde la lente de código me diga "0".
Oliver Schimmer

0

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

"Desafortunadamente, [en Visual Studio Analysis] solo puede detectar miembros privados no utilizados. Esto se debe a que el analizador de código supone que otros programas pueden usar miembros públicos. Esto podría ser cierto si los publica como API a través de un servicio web o liberar su código como una biblioteca ... ReSharper tiene funciones de análisis de código similares, con la ventaja de verificar si hay miembros públicos no utilizados ".


0

Revisaría cada archivo, haría el comando Ctrl-MO para colapsar todo, luego me desplazaría buscando la referencia 0.


-1

Aquí hay una forma manual de lograr esto que he usado para encontrar clases no utilizadas que están marcadas como públicas.

  1. Busque y reemplace todas las "clases públicas" con "clases privadas" para un proyecto en su solución. También puede ser necesario reemplazar "clase estática pública" y / o "clase abstracta pública".
  2. Construye para encontrar todos los errores
  3. Para cada error en la compilación, use su control de origen para restaurar el archivo para la clase referenciada.
  4. Repita para cada error hasta que la compilación tenga éxito.
  5. Los archivos restantes que no se han restaurado son candidatos probables para su eliminación.
  6. (opcional) Cambie el nombre de las clases en los archivos anteriores y realice una compilación más para encontrar errores.
  7. Realice una última búsqueda del nombre de la clase que desea eliminar para confirmar que no haya instancias de que se use en la reflexión o cadenas mágicas.
  8. Elimine los archivos de clase no utilizados identificados.
  9. Repita para cada proyecto de solución que desee limpiar.

Nota: Si no sigue la regla de una clase por archivo, esto requerirá mucho más trabajo. Además, cualquier punto final del servicio API deberá verificar que ningún proyecto externo lo esté utilizando.


14
Esto no es en absoluto práctico.
Don Rolling

1
Funciona para mí en un proyecto grande y es una solución. Los casos pueden variar donde es más difícil, pero quería ofrecer esto como una posibilidad.
Ulfius
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.