Tenho experiência em C ++ e compreendo perfeitamente e concordo com as respostas a esta pergunta: Por que "usar o namespace std;" considerada má prática?
Então, estou surpreso que, tendo alguma experiência com C # agora, vejo exatamente o oposto:
using Some.Namespace;
é literalmente usado em todos os lugares. Sempre que você começa a usar um tipo, você adiciona uma diretiva using ao seu espaço para nome primeiro (se já não estiver lá). Não me lembro de ter visto um .cs
arquivo que não começou using System; using System.Collections.Generic; using X.Y.Z; etc...
. De fato, se você adicionar um novo arquivo por meio do assistente do Visual Studio, ele adicionará automaticamente algumas diretivas de uso, mesmo que você não precise delas. Portanto, enquanto na comunidade C ++ você é basicamente linchado, o C # até incentiva isso. Pelo menos é assim que me parece.
Agora, eu entendo que o uso de diretivas em C # e C ++ não é exatamente a mesma coisa. Além disso, eu entendo que uma das coisas mais desagradáveis que você pode fazer using namespace
em C ++, ou seja, colocá-lo em um arquivo de cabeçalho, não possui equivalente equivalente desagradável em C # devido à falta de um conceito de arquivos de cabeçalho e #include
.
No entanto, apesar de suas diferenças, o uso de diretivas em C # e C ++ serve ao mesmo objetivo, que só precisa digitar SomeType
o tempo todo, e não por muito mais tempo Some.Namespace.SomeType
(em C ++ com em ::
vez de .
). E com esse mesmo objetivo, também o perigo parece ser o mesmo para mim: nomear colisões.
Na melhor das hipóteses, isso resulta em um erro de compilação, portanto você "apenas" precisa corrigi-lo. Na pior das hipóteses, ele ainda compila e o código silenciosamente faz coisas diferentes do que você pretendia. Então, minha pergunta é: Por que (aparentemente) estão usando diretivas consideradas tão desigualmente ruins em C # e C ++?
Algumas idéias de uma resposta que tenho (nenhuma delas realmente me satisfaz):
Os espaços para nome tendem a ser muito mais longos e muito mais aninhados em C # do que em C ++ (
std
vs.System.Collection.Generic
). Portanto, há mais desejo e mais ganho em cancelar o código dessa maneira. Mas, mesmo que isso seja verdade, esse argumento só se aplica quando analisamos os espaços para nome padrão. Os personalizados podem ter qualquer nome abreviado que você queira, tanto em C # quanto em C ++.Os espaços para nome parecem muito mais "finos granulares" em C # do que em C ++. Como exemplo, em C ++ toda a biblioteca padrão está contido em
std
(além de algumas pequenas namespaces aninhados gostochrono
) enquanto em C # você temSystem.IO
,System.Threading
,System.Text
etc. Assim, o risco de ter colisões de nomeação é menor. No entanto, este é apenas um pressentimento. Na verdade, não contei quantos nomes você "importa" comusing namespace std
eusing System
. E, novamente, mesmo que isso seja verdade, esse argumento se aplica apenas ao examinar os espaços para nome padrão. Seus próprios podem ser projetados com granularidade fina, conforme desejado, em C # e C ++.
Existem mais argumentos? Estou especialmente interessado em fatos concretos reais (se houver) e não tanto em opiniões.
Ext(this T t, long l)
qual é chamado via t.Ext(0)
. Se você adicionar outro espaço para nome que contenha um método de extensão Ext(this T t, int i)
, esse será chamado. Mas eu não sou especialista em C # (ainda).