Resharper - Encontre todas as classes não utilizadas

122

Eu sei como encontrar referências não utilizadas de um único arquivo clicando com o botão direito do mouse no arquivo e selecionando a opção "Localizar usos". Existe alguma maneira de ver ou obter a lista de todas as classes ou arquivos não utilizados no meu projeto?

Rocky Singh
fonte
2
Eu usei ndepend para isso no passado.
Cine

Respostas:

195

Primeiro ative "Analisar erros na solução" (clique com o botão direito do mouse no ícone Resharper na barra de status).

Em seguida, clique com o botão direito do mouse no nó da solução e selecione "Localizar problemas do código". Na janela da ferramenta "Resultados da inspeção", você pode agrupar por "Tipo de problema" e procurar "Tipo ou membro do tipo nunca é usado" para obter todas as classes não utilizadas (e muitos outros símbolos não utilizados).

Uma segunda opção (depois de ativar "Analisar erros na solução") é ir para qualquer classe não utilizada, pressionar Alt + Enter, selecionar "Opções para inspeção 'Digite ou digite membro ...'" | Encontre todos os problemas de código deste tipo | Solução inteira.

Amostra da janela de resultados da inspeção

ulrichb
fonte
41
As classes / métodos não utilizados são apresentados em "O tipo ou membro do tipo nunca é usado" em "Redundâncias nas declarações de símbolos". Não tenho certeza se isso se deve a alterações de versão ou se estou vendo de outra maneira.
bulltorious
4
Esta não retornou as classes não utilizados sob quaisquer categorias usando ReSharper 7.1 na VS2013 no Windows 8 ou VS2012 no Windows 7.
Sam Jones
1
Pelo menos no ReSharper 8, você não precisa ativar "Analisar erros na solução" para obter resultados.
Pieter van Ginkel
@SamJones: você está certo .. ele não retorna quaisquer classes não utilizados sob ReSharper 8.1 também ...
Revious
3
Re-compartilhador 10: este relatório não mostra classes não utilizadas. Solução: encontrar alguma classe não utilizado no código, e não "Encontrar problemas semelhantes em solução"
altumano
17

A solução by @ulrichc parece perfeita e funciona bem para projetos de pequeno a médio porte nos quais você não está usando nenhuma estrutura de Injeção de Dependência , como Castle ou Ninject, mas e se você estiver usando o contêiner DI [Castle por exemplo] e tiver algo como o seguinte:

public class IoC
{
    private WindsorContainer _container;

    private IoC()
    {
         _container = new WindsorContainer();
    }

    public static void RegisterFromAssembly(Assembly assembly, string classEndsWith, LifeTime lifeTime)
    {
        var lifestyle = ConvertLifeStyleType(lifeTime);

        _container.Register(AllTypes.FromAssembly(assembly)
                  .Where(type => type.Name.EndsWith(classEndsWith))
                  .WithService.AllInterfaces()
                  .Configure(c => c.LifeStyle.Is(lifestyle))
                  .WithService.FirstInterface());
    }
}

Como você pode ver, RegisterFromAssembly passa por todos os tipos dentro da montagem e, às cegas [com base no parâmetro de métodos], os adiciona ao contêiner no tempo de execução.

Você precisará de algo como o plug-in Agent Mulder, que fornece navegação para os tipos registrados ou resolvidos dentro de seus contêineres. Isso novamente pode visualmente [tempo de design possível] funcionar, mas você não tem certeza, a menos que toda vez que remover a classe não utilizada, execute todos os testes dentro do aplicativo [todas as camadas possíveis] para ter 80% de certeza de que está seguro. Moral da história: uma classe pode parecer não utilizada para o Resharper, mas pode ser ressuscitada quando você usa a Injeção de Dependência.

MHOOS
fonte
3
Bem, não apenas o DI, por qualquer uso de reflexão, essa solução pode falhar.
Mohayemin