Por que remover não utilizado usando diretivas em C #?

120

Eu estou me perguntando se há algum motivo (além de organizar o código-fonte) para os desenvolvedores usarem o Usingsrecurso "Remover Não Usado " no Visual Studio 2008?

bounav
fonte
Acredito que seja um recurso do PowerCommands para Visual Studio, não do próprio Visual Studio.
Hosam Aly de
3
No VS2008, certamente é um recurso (junto com a capacidade de classificar as instruções de uso) do próprio VS.
Richard,
1
@Hosam: PowerCommands permite que você faça isso para todo o projeto / solução. Fazer isso por arquivo é um recurso do próprio VS.
configurador
3
BTW, confira Resharper se você deseja um controle mais preciso sobre este tipo de limpeza.
John Feminella,
2
Na verdade, eu realmente não gosto desse recurso - invariavelmente me pego editando um arquivo e tendo que adicionar novamente todos os namespaces do System depois que alguém os limpou (geralmente System, System.Collections.Generic e System.Linq). mais fricção do que economiza. Agora, os seus próprios namespaces de projeto em vez de namespaces de framework - faz mais sentido limpar, para esclarecer a conexão do seu programa. Gostaria que houvesse uma maneira de o VS limpar as importações apenas de determinados namespaces e deixar aqueles do sistema que você precisa com mais frequência.
user1454265

Respostas:

186

Existem alguns motivos pelos quais você deseja retirá-los.

  • É inútil. Eles não agregam valor.
  • É confuso. O que está sendo usado a partir desse namespace?
  • Do contrário, você gradualmente acumulará usinginstruções inúteis conforme o código muda com o tempo.
  • A análise estática é mais lenta.
  • A compilação do código é mais lenta.

Por outro lado, não há muitos motivos para deixá-los. Suponho que você se poupe do esforço de ter que excluí-los. Mas se você é preguiçoso, tem problemas maiores!

John Feminella
fonte
59
Um bom programador É preguiçoso, ele maximiza o trabalho para NÃO fazer. : D
Nicolas Dorier
34
Não concordo que um bom programador seja preguiçoso, mas concordo com o sentimento de sua declaração. Um bom programador irá apagá-los para manter seu código limpo e, assim, evitar trabalhos / problemas / questões futuras para ele e para os outros.
Allan
2
Certo, esse é um ótimo link. Acho que meu ponto é apenas que queremos "preguiçoso bom" em vez de "preguiçoso ruim"; sendo o último onde os programadores não se deram ao trabalho de escrever um bom código.
Allan
5
Também há mérito em deixar os namespaces padrão. Em grandes projetos e equipes, deixá-los em funcionamento resulta em menos conflitos de fusão potenciais e menos arquivos para revisão de código. Além disso, muitos desenvolvedores adicionam métodos de extensão confusos e difíceis de encontrar às coisas e, às vezes, localizar os namespaces necessários para esses métodos de extensão é um incômodo. Novos desenvolvedores podem estar acostumados a ter o System.Linq, incluído em seus arquivos de código, e perder muito tempo tentando descobrir por que certos métodos não estão disponíveis antes de pedir ajuda.
Mark At Ramp51
5
Você pode querer manter alguns deles para evitar que o intellisense seja burro como o inferno na codificação futura.
yazanpro
24

Eu diria exatamente o contrário - é extremamente útil remover instruções de uso desnecessárias e desnecessárias.

Imagine que você precise voltar ao seu código em 3, 6, 9 meses - ou outra pessoa terá que assumir o controle do seu código e mantê-lo.

Se você tiver uma longa lista enorme de instruções em uso que não são realmente necessárias, olhar para o código pode ser bastante confuso. Por que isso está usando lá, se nada é usado desse namespace ??

Eu acho que em termos de sustentabilidade de longo prazo em um ambiente profissional, eu sugiro fortemente manter seu código o mais limpo possível - e isso inclui despejar coisas desnecessárias dele. Menos desordem é igual a menos confusão e, portanto, maior facilidade de manutenção.

Marc

marc_s
fonte
14

Esta parece-me uma questão muito sensata, que está a ser tratada de forma bastante irreverente pelas pessoas que respondem.

Eu diria que qualquer mudança no código-fonte precisa ser justificada. Essas alterações podem ter custos ocultos, e a pessoa que fez a pergunta gostaria de ser informada disso. Não pediram para ser chamados de "preguiçosos", como uma pessoa inimada.

Acabei de começar a usar o Resharper, e ele está começando a dar avisos e dicas de estilo no projeto pelo qual sou responsável. Entre eles está a remoção de redundantes usando diretivas, mas também qualificadores redundantes, letras maiúsculas e muito mais. Meu instinto é organizar o código e resolver todas as dicas, mas meu chefe de negócios me avisa contra mudanças injustificadas.

Usamos um processo de construção automatizado e, portanto, qualquer alteração em nosso repositório SVN geraria mudanças que não poderíamos vincular a projetos / bugs / problemas e acionaria compilações e lançamentos automatizados que não entregavam nenhuma mudança funcional às versões anteriores.

Se observarmos a remoção dos qualificadores redundantes, isso pode causar confusão aos desenvolvedores, pois as classes de nosso domínio e de dados são diferenciadas apenas pelos qualificadores.

Se eu olhar para o uso adequado de maiúsculas de anacrônimos (ou seja, ABCD -> Abcd), então tenho que levar em consideração que o Resharper não refatora nenhum dos arquivos Xml que usamos para os nomes de classe de referência.

Portanto, seguir essas dicas não é tão simples quanto parece e deve ser tratado com respeito.


fonte
6
Bom ponto, mas você não deve esquecer que manter um código limpo e descomplicado aumenta a capacidade de manutenção, que também é um objetivo de negócios. Você tem que pesar ambos. Idealmente, você deseja fazer esse tipo de refatoração logo após o lançamento, para que possa ter uma lousa o mais limpa possível para começar uma nova e ter bastante tempo para capturar eventuais regressões.
David Reis,
14

Além das razões já fornecidas, evita conflitos de nomenclatura desnecessários. Considere este arquivo:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

Este código não é compilado porque os namespaces System.IO e System.Windows.Shapes contêm, cada um, uma classe chamada Path. Poderíamos consertá-lo usando o caminho de classe completo,

        private static string temporaryPath = System.IO.Path.GetTempFileName();

ou podemos simplesmente remover a linha using System.Windows.Shapes;.

hypehuman
fonte
13

Menos opções no pop-up do Intellisense (especialmente se os namespaces contiverem muitos métodos de extensão).

Teoricamente, o Intellisense também deveria ser mais rápido.

cbp
fonte
1
1 para intellisense. Na verdade, é lento na inicialização (vejo regularmente "Criando cache, tente novamente mais tarde"), então isso pode ser realmente significativo. Compile o tempo de que todo mundo fala ... Ainda estou para ver os números.
Luc
5

Remova eles. Menos código para olhar e questionar economiza tempo e confusão. Eu gostaria que mais pessoas MANTENHAM AS COISAS SIMPLES, LEGAIS e ORGANIZADAS. É como ter camisas e calças sujas no quarto. É feio e você deve se perguntar por que está ali.

Tim Duncan
fonte
4

Também ajuda a evitar dependências circulares falsas, supondo que você também seja capaz de remover algumas referências dll / projeto de seu projeto após remover os usos não utilizados.

Jeremy C.
fonte
3

O código compila mais rápido.

Conta morta
fonte
5
Tem alguma evidência para comprovar isso?
cjk
14
Oh CK - você me pegou de novo. Eu menti. Remover texto desnecessário torna a compilação do código mais lenta. Pense nisso :)
Conta morta em
@ck: Eu verifiquei que a remoção de declarações não utilizadas de um projeto no trabalho melhorou o tempo de compilação em uma quantidade perceptível. Claro que sim - menos bytes para ler do disco rígido.
configurador
19
Seria bom ver algumas estatísticas reais. Se estivermos economizando apenas alguns milissegundos durante a compilação, a velocidade não é um argumento convincente. No entanto, existem outras razões para remover as declarações desnecessárias.
Greg,
3
Não se trata de mentir ou não. Qualquer pessoa sensata diria que menos desordem significa mais eficiência. A "evidência" para fazer o backup é fornecer valor à sua resposta e apoiar o argumento de que "mais rápido" não significa apenas alguns ms, mas na verdade uma experiência aprimorada para compilar seu projeto mais rapidamente.
Matheus Felipe
3

Recentemente, descobri outro motivo pelo qual excluir importações não utilizadas é muito útil e importante.

Imagine que você tem dois assemblies, onde um referencia o outro (por agora vamos chamar o primeiro Ae o referenciado B). Agora, quando você tem código em A que depende de B, está tudo bem. No entanto, em algum estágio do processo de desenvolvimento, você percebe que não precisa mais desse código, mas deixa a instrução de uso onde estava. Agora você não só tem uma using-diretiva sem sentido, mas também uma referência de assembly para a Bqual não é usada em nenhum lugar, a não ser na diretiva obsoleta. Isso primeiro aumenta a quantidade de tempo necessária para compilar A, pois também Bprecisa ser carregado.

Portanto, esse não é apenas um problema no código mais limpo e fácil de ler, mas também na manutenção de referências de assembly no código de produção, onde nem todos os assemblies referenciados existem .

Finalmente, em nosso exemplo, tivemos que enviar B e A juntos, embora B não seja usado em nenhum lugar em A, mas na usingseção-. Isso afetará enormemente o desempenho do tempo de execuçãoA ao carregar o assembly.

HimBromBeere
fonte
2

Pelo menos em teoria, se você recebeu um arquivo C # .cs (ou qualquer arquivo de código-fonte de programa único), você deve ser capaz de olhar o código e criar um ambiente que simula tudo o que ele precisa. Com alguma técnica de compilação / análise, você pode até criar uma ferramenta para fazer isso automaticamente. Se isso for feito por você, pelo menos em mente, você pode garantir que entendeu tudo o que o arquivo de código diz.

Agora considere, se você recebeu um arquivo .cs com 1000 usingdiretivas que apenas 10 foram realmente usadas. Sempre que você olhar para um símbolo recém-introduzido no código que faz referência ao mundo externo, você terá que percorrer essas 1000 linhas para descobrir o que é. Isso obviamente retarda o procedimento acima. Portanto, se você puder reduzi-los para 10, isso ajudará!

Em minha opinião, a usingdiretiva C # é muito fraca, uma vez que você não pode especificar um único símbolo genérico sem que a genericidade seja perdida, e você não pode usar a usingdiretiva de alias para usar métodos de extensão. Este não é o caso em outras linguagens como Java, Python e Haskell, nessas linguagens você é capaz de especificar (quase) exatamente o que deseja do mundo exterior. Mas caso então, vou sugerir o uso de usingalias sempre que possível.

Earth Engine
fonte