Por que você deve remover o C # desnecessário usando diretivas?

216

Por exemplo, raramente preciso de:

using System.Text;

mas está sempre lá por padrão. Presumo que o aplicativo usará mais memória se o seu código contiver diretivas desnecessárias . Mas há mais alguma coisa que eu deva estar ciente?

Além disso, faz alguma diferença se a mesma diretiva de uso for usada em apenas um arquivo versus a maioria / todos os arquivos?


Edit: Observe que esta pergunta não é sobre o conceito não relacionado chamado de declaração using , projetado para ajudar a gerenciar recursos, garantindo que quando um objeto sai do escopo, seu método IDisposable.Dispose seja chamado. Consulte Usos de "using" em C # .

steffenj
fonte

Respostas:

181

Não mudará nada quando o seu programa for executado. Tudo o que é necessário é carregado sob demanda. Portanto, mesmo se você tiver essa instrução using, a menos que você realmente use um tipo nesse namespace / assembly, o assembly ao qual a instrução está correlacionada não será carregado.

Principalmente, é apenas para limpar a preferência pessoal.

Darren Kopp
fonte
@ francip - é o que estou dizendo. O uso não afeta o carregamento da montagem, uma montagem não é carregada até que um tipo contido na montagem seja referenciado.
Darren Kopp
69
mas isso pode afetar o tempo de compilação e a capacidade de resposta do Intellisense / IDE.
Marchy
475

Não são poucas razões para remover não utilizado usando (s) / namespaces, além de codificação preferência:

  • a remoção de cláusulas não utilizadas em um projeto pode acelerar a compilação porque o compilador possui menos espaços de nomes para os tipos de pesquisa a serem resolvidos. (isso é especialmente verdadeiro para o C # 3.0 devido aos métodos de extensão, nos quais o compilador deve procurar todos os espaços de nomes em busca de métodos de extensão para possíveis correspondências melhores, inferência de tipo genérico e expressões lambda envolvendo tipos genéricos)
  • pode ajudar a evitar a colisão de nomes em futuras compilações quando novos tipos são adicionados aos espaços para nome não utilizados que têm o mesmo nome que alguns tipos nos espaços para nome usados.
  • reduzirá o número de itens na lista de preenchimento automático do editor durante a codificação, levando possivelmente a uma digitação mais rápida (no C # 3.0, isso também pode reduzir a lista de métodos de extensão mostrados)

O que remover os namespaces não utilizados não fará:

  • alterar de qualquer forma a saída do compilador.
  • alterar de qualquer forma a execução do programa compilado (carregamento mais rápido ou melhor desempenho).

O conjunto resultante é o mesmo com ou sem os usos não utilizados removidos.

Pop Catalin
fonte
3
E à medida que você modifica os arquivos, você acaba adicionando mais e mais namespaces ao início dos arquivos. Portanto, se você não remover os espaços para nome não utilizados, ao abrir o arquivo, tudo o que você verá é uma lista gigante de espaços para nome em vez da implementação real.
Mert Akcakaya
5
Em relação à compilação mais rápida: usingdiretivas não utilizadas em .csarquivos podem impedir que você remova algumas referências de montagem (caso contrário não utilizadas) do seu .csprojprojeto. Se você tiver uma "solução" de muitos projetos, referências desnecessárias entre os projetos forçarão a compilação dos projetos em uma ordem específica, quando na verdade eles são independentes e podem ser compilados em paralelo. Portanto, remova as usingdiretivas não utilizadas antes de verificar se há referências de projetos não utilizadas em uma solução de vários projetos.
Jeppe Stig Nielsen
1
Essa é uma ótima explicação - no final, não tem muito a ver com desempenho, mas com as melhores práticas. Obrigado por explicar!
GSaunders
39

A limpeza do código é importante.

Começamos a ter a sensação de que o código pode não ser mantido e no caminho da browfield quando vemos usos supérfluos. Em essência, quando vejo algumas declarações de uso não utilizadas, uma pequena bandeira amarela aparece no fundo do meu cérebro, dizendo-me para "prosseguir com cautela". E a leitura do código de produção nunca deve lhe dar essa sensação.

Então limpe seus usos. Não seja desleixado. Inspire confiança. Deixe seu código bonito. Dê a outro desenvolvedor aquela sensação de aconchegante.

testemunho
fonte
Agora é isso que eu queria ouvir :-) Estou acostumado a fazer um de Organize Usings -> Remove and Sortvez em quando. BTW, para mim as duas opções superiores Organize Usingssão sem sentido. Eu estou falando sobre VS2013 btw.
Sнаđошƒаӽ
30

Não há nenhuma construção de IL que corresponda using. Portanto, as usinginstruções não aumentam a memória do aplicativo, pois não há código ou dados gerados para ele.

Usingé usado no momento da compilação apenas para fins de resolução de nomes curtos de tipos para nomes de tipos completos. Assim, o único efeito negativo desnecessário que usingpode ter é diminuir o tempo de compilação e consumir um pouco mais de memória durante a compilação. Eu não ficaria preocupado com isso.

Portanto, o único efeito negativo real de ter usinginstruções que você não precisa é no intellisense, pois a lista de possíveis correspondências para conclusão enquanto você digita aumenta.

Franci Penov
fonte
4

Você pode ter conflitos de nome se chamar suas classes como as classes (não usadas) no espaço para nome. No caso do System.Text, você terá um problema se definir uma classe chamada "Encoder".

De qualquer forma, isso geralmente é um problema menor e detectado pelo compilador.

Pablo Fernandez
fonte
2

Seu aplicativo não usará mais memória. É para o compilador encontrar classes que você usa nos arquivos de código. Realmente não dói além de não estar limpo.

mattlant
fonte
2

É preferência pessoal principalmente. Eu também os limpo (o Resharper faz um bom trabalho em me dizer quando há necessidade de usar declarações).

Pode-se dizer que isso pode diminuir o tempo de compilação, mas com a velocidade do computador e do compilador atualmente, isso não causaria nenhum impacto perceptível.

Josh Sklare
fonte
2

Deixar usingdiretivas extras é bom. Há pouco valor em removê-los, mas não muito. Por exemplo, torna minhas listas de conclusão do IntelliSense mais curtas e, portanto, mais fáceis de navegar.

Os assemblies compilados não são afetados por usingdiretivas externas .

Às vezes, coloco-os dentro de um #regione deixo-o em colapso; isso torna a visualização do arquivo um pouco mais limpa. OMI, este é um dos poucos bons usos de #region.

Jay Bazuzi
fonte
1
Eles podem ser recolhidos sem região
abatishchev
1
@abatishchev: Sim, isso é verdade no VS2010.
Jay Bazuzi
"Um dos poucos bons usos de #region", então você quer dizer que o uso #regioné ruim na maioria dos aspectos?
Steven
Sim, #regioné um cheiro de código. Diz que muita coisa está acontecendo na sua classe.
Jay Bazuzi 24/07/19
2

se você deseja manter seu código limpo, as usinginstruções não usadas devem ser removidas do arquivo. os benefícios aparecem muito claros quando você trabalha em uma equipe colaborativa que precisa entender seu código, acha que todo o seu código deve ser mantido, menos código = menos trabalho, os benefícios são de longo prazo.

Masd
fonte
1

Eles são usados ​​apenas como um atalho. Por exemplo, você teria que escrever: System.Int32 toda vez que você não tivesse um System usando; em cima.

Remover os não utilizados apenas faz com que seu código pareça mais limpo.

Carra
fonte
1

A instrução using apenas impede que você qualifique os tipos que você usa. Eu pessoalmente gosto de limpá-los. Realmente depende de como uma métrica loc é usada

CheeZe5
fonte
1

Ter apenas os espaços para nome que você realmente usa permite manter seu código documentado.

Você pode encontrar facilmente quais partes do seu código estão se chamando por qualquer ferramenta de pesquisa.

Se você tiver namespaces não utilizados, isso não significa nada ao executar uma pesquisa.

Estou trabalhando na limpeza de espaços para nome agora, porque constantemente me perguntam quais partes do aplicativo estão acessando os mesmos dados de uma maneira ou de outra.

Eu sei quais partes estão acessando dados de qualquer maneira devido ao acesso a dados ser separado por namespaces, por exemplo, diretamente através de um banco de dados e diretamente através de um serviço da web.

Não consigo pensar em uma maneira mais simples de fazer isso de uma só vez.

Se você apenas deseja que seu código seja uma caixa preta (para os desenvolvedores), sim, não importa. Mas se você precisar mantê-lo ao longo do tempo, é uma documentação valiosa como todos os outros códigos.

Timothy Gonzalez
fonte
0

A instrução 'using' não afeta o desempenho, pois é apenas um auxiliar na qualificação dos nomes dos seus identificadores. Portanto, em vez de precisar digitar System.IO.Path.Combine (...) , você pode simplesmente digitar Path.Combine (...) se estiver usando o System.IO .

Jordan Parmer
fonte
0

Não esqueça que o compilador trabalha muito para otimizar tudo ao criar seu projeto. Usar isso é usado em muitos lugares ou 1 não deve ser diferente uma vez compilado.

Patrick Desjardins
fonte