Estou organizando um projeto de biblioteca e tenho uma classe de gerenciador central chamada Scenegraph
e um monte de outras classes que vivem no namespace Scenegraph.
O que eu realmente gostaria é que o Scenegraph MyLib.Scenegraph
e as outras classes o sejam MyLib.Scenegraph.*
, mas parece que a única maneira de fazer isso seria tornar todas as outras classes internas Scenegraph
no arquivo Scenegraph.cs e isso é muito pesado .
Em vez disso, organizei-o como Mylib.Scenegraph.Scenegraph
e MyLib.Scenegraph.*
, o que meio que funciona, mas acho que o Visual Studio fica confuso em algumas condições se estou me referindo à classe ou ao namespace.
Existe uma boa maneira de organizar este pacote de forma que seja conveniente para os usuários, sem agrupar todo o meu código em uma bagunça impossível de manter?
fonte
using Foo.Bar;
mais tardeBar b
está claramente se referindo aBar
uma classe (ou enum) dentro do namespaceFoo.Bar
. A verdadeira razão para não fazer isso é puramente que o compilador C # não consegue entendê-lo corretamente, o que é terrivelmente surpreendente e lamentável. Qualquer outra coisa é um conselho de estilo confuso.Dar o mesmo nome ao namespace e à classe pode confundir o compilador como outros disseram.
Como nomear então?
Se o namespace tiver várias classes, encontre um nome que defina todas essas classes.
Se o namespace tiver apenas uma classe (e, portanto, a tentação de dar a ela o mesmo nome), nomeie o namespace ClassName NS . É assim que a Microsoft nomeia seus namespaces, pelo menos.
fonte
Eu sugeriria que você siga o conselho que comecei
microsoft.public.dotnet.languages.csharp
a usarMyLib.ScenegraphUtil.Scenegraph
eMyLib.ScenegraphUtil.*
.fonte
CA1724: Type Names Should Not Match Namespaces
...Basicamente, se você seguir a Análise de código para a codificação adequada, esta regra diz para não fazer o que está tentando fazer. A análise de código é muito útil para ajudá-lo a encontrar possíveis problemas.
fonte
Apenas adicionando meus 2 centavos:
Tive a seguinte aula:
O cliente foi escrito assim:
Perdoando o erro GetFoo não retornar a saída em vez de usar o parâmetro out, o compilador não pôde resolver o tipo de dados Foo.Bar []. Ele estava retornando o erro: não foi possível encontrar o tipo ou namespace Foo.Bar.
Parece que ao tentar compilar, ele resolveu Foo como a classe e não encontrou uma classe Bar embutida na classe Foo. Ele também não conseguiu encontrar um namespace chamado Foo.Bar. Ele falhou ao procurar por uma classe Bar no namespace Foo. Os pontos em um espaço de nome NÃO são sintáticos. A string inteira é um token, não as palavras delimitadas por pontos.
Este comportamento foi exibido pelo VS 2015 executando .Net 4.6
fonte
Mesmo que eu concorde com outras respostas no sentido de que você não deve nomear sua classe da mesma forma que seu namespace há momentos em que você não pode cumprir esses requisitos.
No meu caso, por exemplo, não fui eu quem tomou essa decisão, portanto, precisava encontrar uma maneira de fazê-la funcionar.
Portanto, para aqueles que não podem alterar o nome do namespace nem o nome da classe, aqui está uma maneira de fazer seu código funcionar.
Basicamente, criei "aliases" de namespace e isso me permitiu qualificar totalmente a classe e a "confusão" do Visual Studio foi embora.
NOTA: Você deve evitar esse conflito de nomes se estiver sob seu controle. Você só deve usar a técnica mencionada quando não estiver no controle das classes e namespaces em questão.
fonte
Postagem antiga, mas aí vou eu com outra ideia que pode ajudar alguém:
"... mas parece que a única maneira de fazer isso seria tornar todas as outras classes classes internas do Scenegraph no arquivo Scenegraph.cs e isso é muito pesado."
Esta é realmente a melhor implementação para vários cenários. Mas, eu concordo que ter todo esse código no mesmo arquivo .cs é irritante (para dizer o mínimo).
Você poderia resolvê-lo tornando a classe base uma "classe parcial" e, em seguida, continuar criando as classes internas em seus próprios arquivos (apenas lembre-se de que eles terão que declarar o complemento da classe base e então continuar com a classe interna específica para esse arquivo).
Algo como...
Scenegraph.cs:
DependentClass.cs:
Eu realmente acho que isso é o mais perto que você pode chegar de ter uma implementação limpa de classes internas, sem ter que desordenar tudo dentro de um arquivo enorme e confuso.
fonte
Como outros já disseram, é uma boa prática evitar nomear uma classe da mesma forma que seu namespace.
Aqui estão algumas sugestões de nomenclatura adicionais de uma resposta de svick a uma pergunta relacionada "Same class and namespace name" no Software Engineering Stack Exchange:
(Note-se que os usos resposta acima
Model.DataSource.DataSource
,Model.QueryStorage.QueryStorage.
eModel.Project.Project
como exemplos, em vez deMyLib.Scenegraph.Scenegraph
.)(Também achei úteis as outras sugestões de nomes nas outras respostas aqui).
fonte
Acontece quando é a classe principal do namespace. Portanto, é uma motivação colocar o namespace em uma biblioteca, o problema desaparece se você adicionar 'Lib' ao nome do namespace ...
fonte