Obter lista de códigos de referência zero no Visual Studio

133

No visual studio 2013, o número de referências de um código especial (método, propriedade, campo, ...) é mostrado pelo Code Lens . Quero obter códigos não utilizados (referência zero) no visual studio. Existe alguma maneira de obtê-los?

Quero dizer abaixo referência:

insira a descrição da imagem aqui

Nima Rostami
fonte
7
Acho que ele quer uma lista de todos os métodos que não são referenciados, em vez de zerar o número de referências desse método específico.
precisa
1
Se você não quer encontrar referências não utilizadas, você vai encontrar um monte de perguntas duplicadas. Apenas google para "c # encontrar código não utilizado"
Panagiotis Kanavos
1
sim eu quero encontrar todos os códigos não utilizados contêm métodos, propriedades, etc
Nima Rostami
1
Lembre-se de que você não pode ter certeza de que a publicnão é usado sem pesquisar toda a base de códigos. No entanto, para internos e privados não utilizados, o Code Analysis avisará se você tiver o aviso apropriado ativado.
Matthew Watson
2
Anos depois, a captura de tela continua enganosa.
Sinjai

Respostas:

184

Provavelmente, a melhor e mais fácil maneira de conseguir o que você procura é usar a ferramenta de análise de código incorporada com o Visual Studio para encontrar e levá-lo diretamente ao código morto e aos membros não utilizados.

Para esse efeito, criei um novo arquivo de conjunto de regras de análise de código (Via Arquivo-> Novo-> Arquivo , certificando -me de que Geral no painel esquerdo foi selecionado e rolando para baixo para encontrar o Conjunto de Regras de Análise de Código , dando a ele um nome de arquivo e, em seguida, procurando e selecionando as regras abaixo). Veja abaixo o conteúdo do arquivo do conjunto de regras que você pode copiar e cole em um novo arquivo com a extensão .ruleset a ser usada.

Dado um arquivo de conjunto de regras, é possível clicar com o botão direito do mouse em um arquivo de projeto no painel Gerenciador de Soluções e selecionar Propriedades . Nas janelas de propriedades do projeto, clique na guia Análise de Código no painel esquerdo e clique em Abrir para procurar o local do arquivo .ruleset. Se você acessar as propriedades de um arquivo de solução (em oposição a um arquivo de projeto), poderá definir o arquivo de análise de código para cada projeto na solução em um único local (em Configurações de Análise de Código e usando o menu suspenso para selecionar NOTA: Você deve ter navegado anteriormente até o arquivo do conjunto de regras para que ele apareça no menu suspenso nesta janela de propriedades).

Em seguida, basta executar a análise de código nos projetos / solução (Via Analisar-> Executar análise de código na solução -OR- Alt + F11 ) e ela retornará como avisos, quaisquer métodos não referenciados ou membros não utilizados encontrados. Ele até encontrará métodos referenciados por um método, que não possui referências em nenhum outro lugar.

No entanto, tenha cuidado, pois uma das maneiras pelas quais a análise de código para código morto pode orientá-lo errado é se a referência está "oculta", apenas chamando o método por meio de delegados e, é claro, de reflexão.

As regras para detectar código morto, especificamente, são:

  • Métodos particulares que não são chamados de nenhum outro código (CA1811)
  • Variáveis ​​locais não usadas (CA1804)
  • Campos particulares não utilizados (CA1823)
  • Parâmetros não utilizados (CA1801)
  • Classes internas que não são instanciadas por nenhum outro código (CA1812).
  • Código inoperante no comutador limitado OR bit a bit (C6259)

Abaixo está o conteúdo do arquivo .ruleset que pode ser obtido seguindo as etapas acima, para sua conveniência. Você pode simplesmente copiar o XML abaixo, colá-lo no bloco de notas ++, salvar em algum lugar com a extensão .ruleset , procurar e usar conforme explicado acima:

<?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
fonte
30
Eu não acho que isso responda completamente à pergunta. A principal diferença é que o CodeLens informará que um método PUBLIC tem zero referências em uma solução inteira. Essa é a chave. FxCop, R # e seu método de otimizar para qualquer coisa que não seja pública.
23816 Scott Wylie
1
@ScottWylie - eu discordo. Eu apenas tentei a solução acima e ela não sinalizou métodos públicos não referenciados. O CodeLens foi excepcional ao sinalizar código morto, coisas locais não referenciadas e variáveis ​​não utilizadas. Eu acho que isso leva a maioria das pessoas exatamente o que elas querem sem usar uma ferramenta de terceiros.
Mike3 /
7
@ mike Considere o seguinte: Se você deseja encontrar um código morto com uma operação em massa, costuma não se importar com membros privados / protegidos, porque esses são problemas locais. Por exemplo, estou migrando um projeto 500k + LoC com mais de 100 projetos e mais de 10 soluções para uma arquitetura de padrão de repositório. Depois de migrar um componente, preciso saber quais interfaces antigas posso excluir. Alguns IDEs como o Eclipse têm ferramentas para exatamente isso. Métodos locais esmaecidos simplesmente não são da minha conta, eu gostaria de uma lista de classes / interfaces PUBLIC onde a lente do código me diz "0".
Oliver Schimmer
0

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

"Infelizmente, [no Visual Studio Analysis] você pode detectar apenas membros privados não utilizados. Isso ocorre porque o analisador de código supõe que membros públicos possam ser usados ​​por outros programas. Isso pode ser verdade se você os publicar como uma API por meio de um serviço da Web. ou liberando seu código como uma biblioteca ... O ReSharper possui funções de análise de código semelhantes - com a vantagem de verificar se há membros públicos não utilizados ".

V Frenkel
fonte
0

Eu examinaria cada arquivo, executaria o comando Ctrl-MO para recolher tudo e, em seguida, role a página procurando a referência 0.

user1730026
fonte
-1

Aqui está uma maneira manual de fazer isso que eu usei para encontrar Classes não utilizadas marcadas como públicas.

  1. Pesquise e substitua todas as "classes públicas" por "classes privadas" de um projeto em sua solução. Também pode ser necessário substituir "classe estática pública" e / ou "classe abstrata pública".
  2. Crie para encontrar todos os erros
  3. Para cada erro na compilação, use seu controle de origem para restaurar o arquivo para a classe referenciada.
  4. Repita para cada erro até que a compilação seja bem-sucedida.
  5. Todos os arquivos restantes que não foram restaurados provavelmente são candidatos à remoção.
  6. (opcional) Renomeie as classes nos arquivos acima e faça mais uma compilação para encontrar erros.
  7. Faça uma última pesquisa pelo nome da classe que você deseja remover para confirmar se não há nenhuma instância dela sendo usada em reflexões ou seqüências de caracteres mágicas.
  8. Remova os arquivos de classe não utilizados identificados.
  9. Repita para cada projeto de solução que você deseja limpar.

Nota: Se você não seguir a regra de uma classe por arquivo, isso exigirá muito mais trabalho. Além disso, qualquer terminal de serviço de API que você precisará verificar se não está sendo usado por nenhum projeto externo.

Ulfius
fonte
14
Isso não é nada prático.
Don Rolando
1
Funciona para mim em um projeto grande e é uma solução. Os casos podem variar onde é mais difícil, mas eu queria fornecer isso como uma possibilidade.
Ulfius 25/09/19