As enumerações em C # devem ter seu próprio arquivo? [fechadas]

178

Eu tenho uma classe que usa uma enumeração, a enum está atualmente em seu próprio arquivo, o que parece um desperdício.

Qual é a opinião geral sobre enumerações sendo colocadas no espaço para nome de um arquivo em que elas são consumidas? Ou o enum deve realmente viver em seu próprio arquivo cs?

Editar

Devo mencionar que, embora a classe em questão use essas enumerações, os chamadores externos também. Em outras palavras, outra classe pode definir essas enumerações. Portanto, eles não são usados ​​internamente para a turma, caso contrário, essa pergunta seria um acéfalo.

Finglas
fonte
86
Se você usasse números mágicos, não teria esse problema.
MusiGenesis
7
Este deve ser um wiki da comunidade? Não há resposta correta nem considerações técnicas reais além dos recursos do IDE.
Jeff Sternal
1
Eles ainda podem estar no mesmo espaço para nome, mesmo que estejam em arquivos diferentes. Se você está perguntando se deseja criar um espaço para nome .Enums E um novo arquivo, então eu diria que normalmente não. Mas por outro lado, você pode ter o seu entendimento de namespaces errado e deve ler sobre eles - (não muito para eles, apenas um mecanismo de organização)
Jason Kleban
1
Declarando enum em seu próprio arquivo de permitir programador para localizar enum facilmente usando a janela de comando (> de [enum Name])
Riju

Respostas:

103

Eu não diria "desperdício" (quanto custa um arquivo extra?), Mas muitas vezes é inconventiente. Geralmente, há uma classe que está mais intimamente associada à enumeração, e eu as coloco no mesmo arquivo.

James Curran
fonte
7
Ele adiciona ruído ao diretório durante a navegação, é o que eu quis dizer com desperdício.
Finglas
117
@Finglas - o ruído de uma pessoa é o sinal de outra pessoa!
Jeff Sternal
6
Geralmente, há uma classe que está mais intimamente associada. Mas se isso mudar, se alguém aparecer de cada vez e decidir depender da enum, é hora de refatorar.
Brennan Pope
2
Se o enum deve ser compartilhado entre diferentes classes, é preferível colocá-lo em um arquivo separado.
Konrad
76

Isso é realmente apenas uma questão de preferência.

Eu prefiro colocar cada enumeração em seu próprio arquivo (da mesma forma para cada interface, classe e estrutura, por menor que seja). Isso os torna mais fáceis de encontrar quando venho de outra solução ou caso contrário ainda não tem uma referência ao tipo em questão.

A inserção de um único tipo em cada arquivo também facilita a identificação de alterações nos sistemas de controle de origem sem diferenças.

Jeff Sternal
fonte
10
"A inserção de um único tipo em cada arquivo também facilita a identificação de alterações nos sistemas de controle de origem sem diferenças." Um medo de divergir não deve formar a base de suas decisões de design. Eu diria mesmo que quem não sabe diferenciar adequadamente um arquivo no controle de origem não está realmente usando o controle de origem.
Dan Bechard
59

Isso é inteiramente uma questão de estilo. O que costumo fazer é ter um arquivo chamado Enums.csna solução na qual as declarações de enum são coletadas.

Mas eles geralmente são encontrados através da F12chave.

Fredrik Mörk
fonte
4
Eu acho que essa é provavelmente a melhor opção, pois: 1) é apenas um arquivo, em vez de muitos, que pode ser considerado uma bagunça no diretório 2) é claro o que está contido no arquivo 3) significa que você sabe onde encontrar um em enumvez de ele estar em um arquivo contendo uma classe que está relacionado, mas não necessariamente a única classe de usá-lo
dav_i
6
Eu absolutamente não gosto disso. Como dito na resposta de James Curran, as enumerações têm uma relação principalmente com as classes. Ao colocá-los todos em um arquivo global, eles nem sequer estão em um diretório (para um subespaço de nome) mais ao qual poderiam pertencer tematicamente.
Ray
3
Sim @DebugErr, eu concordo com você. Desde que essa resposta foi postada em 2010, eu mudei entre várias abordagens e tendem a usar um arquivo por tipo ou declarar enumerações no mesmo arquivo que a classe relacionada.
Fredrik Mörk 23/08
@Ray ...enums have a relation to classes mostly.. Foi aqui que você me perdeu. Por favor, dê um exemplo de como você lidaria com enumerações que têm relações com várias classes?
K - A toxicidade no SO está crescendo.
@KarlMorrison Por favor, esse comentário tem 5 anos. Enfim, adicionei a palavra "principalmente" por um motivo. Enums têm uma relação com mais do que apenas classes, como namespaces também. Se eu tivesse um AnchorStyleenum usado em toda a biblioteca da interface do usuário, normalmente também teria um sub namespace da interface do usuário e a pasta correspondente. Eu o colocaria em um AnchorStyle.csarquivo na pasta da interface do usuário, onde posso encontrá-lo facilmente, não em um arquivo "Enums.cs" chamado de forma genérica.
Raio
47

A pergunta a ser feita seria: existe algo sobre um tipo de enumeração em C # que indica que eu deveria tratá-lo de maneira diferente de todos os outros tipos criados?

Se a enumeração for pública, ela deve ser tratada como qualquer outro tipo público. Se for privado, declare-o como um membro aninhado da classe usando-o. Não há motivo convincente para colocar dois tipos públicos no mesmo arquivo simplesmente porque um é uma enumeração. O fato de ser do tipo público é tudo o que importa; o sabor do tipo não.

Bryan Watts
fonte
E se você quiser reutilizar enums em uma solução diferente do mesmo projeto corporativo? Vincular enums com classe usando seria muito difícil reutilizá-lo.
Mk9
@ko: A referência do projeto já significa que a classe e o enum estarão disponíveis para a solução diferente. O que tornaria isso difícil?
Bryan Watts
Claro, mas você realmente deseja compartilhar toda a classe com sua lógica se quiser usar apenas enumerações? Mais ainda, se uma classe diferente compartilhar a mesma enumeração. Onde você o colocaria?
Mk9
@ko: Com uma referência de projeto, você obterá os dois tipos, estejam eles em arquivos diferentes ou não. Estou tendo problemas para descobrir o que você está perguntando.
Bryan Watts
Bem, eu não estou falando sobre referência de projeto, você é. Estou falando de mover enums para um arquivo de projeto compartilhado e poder reutilizá-lo em vários projetos sem expor classes inteiras. Você diz "Não há motivo convincente para colocar dois tipos públicos no mesmo arquivo simplesmente porque um é uma enumeração". Talvez haja uma razão para colocar todas as enumerações no mesmo arquivo se você seguir minha explicação.
MKO
24

Outra vantagem de colocar cada tipo (classe, estrutura, enum) em seu próprio arquivo é o controle de origem. Você pode facilmente obter todo o histórico do tipo.

Tommy Carlier
fonte
18

Coloco principalmente dentro do namespace e fora da classe, para que seja facilmente acessível outras classes nesse namespace, como abaixo.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
fonte
Uau. Eu não sabia que enums podem ser colocadas diretamente no espaço para nome. Eu estou indo com esta resposta. Dentro da minha estrutura MVC, eles serão colocados dentro do controlador, o que faz lógica para mim. Obrigado por isso. Votado.
C4d C
11

Geralmente, prefiro que minhas enumerações estejam no mesmo arquivo da classe da qual provavelmente será um atributo. Se, por exemplo, eu tiver uma classe Task, o enum TaskStatusestará no mesmo arquivo.

No entanto, se eu tiver enumerações de natureza mais genérica, eu as mantenho contextualmente em vários arquivos.

Nikos Steiakakis
fonte
E se uma classe diferente também usar a mesma enumeração?
Mk9
2
@mko - É por isso que eu disse (em 2010, quando respondi isso) que, se as enumerações tiverem uma natureza mais genérica, eu as manteria em arquivos separados. Por contexto, quis dizer que, em alguns casos, algumas enumerações podem estar em um arquivo separado e, em outros casos, eu poderia agrupar um conjunto de declarações de enumeração em um único arquivo.
Nikos Steiakakis 10/10/19
10

Depende do acesso necessário.

Se o enum é usado apenas por uma única classe, não há problema em declará-lo nessa classe porque você não precisa usá-lo em nenhum outro lugar.

Para enumerações usadas por várias classes ou em uma API pública, sempre manterei a definição em seu próprio arquivo no espaço de nomes apropriado. É muito mais fácil encontrar esse caminho, e a estratégia segue o padrão de um objeto por arquivo, o que também é bom para usar com classes e interfaces.

Jon Seigel
fonte
8

Eu acho que isso depende do escopo do enum. Por exemplo, se o enum é específico para uma classe, por exemplo, usado para evitar o cenário mágico constante, então eu diria que coloque-o no mesmo arquivo da classe:

enum SearchType { Forward, Reverse }

Se o enum é geral e pode ser usado por várias classes para diferentes cenários, então eu estaria inclinado a usá-lo em seu próprio arquivo. Por exemplo, o abaixo pode ser usado para várias finalidades:

enum Result { Success, Error }
Vishal Mistry
fonte
6

Costumo colocar enumerações em seu próprio arquivo por um motivo muito simples: como nas classes e estruturas, é bom saber exatamente onde procurar se você deseja encontrar a definição de um tipo: no arquivo com o mesmo nome. (Para ser justo, no VS você sempre pode usar "Ir para a definição" também.)

Obviamente, pode ficar fora de controle. Um colega em que trabalho cria arquivos separados para os delegados.

Dan Tao
fonte
6

Uma vantagem de usar um arquivo separado para enumerações é que você pode excluir a classe original que usou a enumeração e escrever uma nova classe usando a enumeração.

Se a enumeração for independente da classe original, colocá-la em um arquivo separado facilita as alterações futuras.

Doug Ferguson
fonte
6

Se você estiver usando o suplemento USysWare File Browser para Visual Studio, poderá encontrar rapidamente arquivos de nomes específicos na sua solução. Imagine procurar um enum que não esteja em seu próprio arquivo, mas que esteja enterrado em algum arquivo em uma solução gigantesca.

Para pequenas soluções, não importa, mas para grandes, torna-se ainda mais importante manter classes e enums em seus próprios arquivos. Você pode encontrá-los rapidamente, editá-los e muito mais. Eu recomendo colocar seu enum em seu próprio arquivo.

E como foi afirmado ... Qual é o desperdício de um arquivo que acaba sendo apenas alguns kb?

Batalla
fonte
Eu uso esse suplemento também, é bastante útil. Eu colocava enums em seu próprio arquivo, não importa se a solução é grande ou pequena.
Rui Jarimba
5

Vantagem enorme muito simples para separar o arquivo. Quando qualquer objeto está em seu próprio arquivo MyObjectName.cs ... você pode acessar o Solution Explorer e digitar MyObjectName.cs e exibir exatamente 1 arquivo. Qualquer coisa que melhore a depuração é bom.

Outra vantagem em uma nota semelhante: se você pesquisar um nome em todos os arquivos ( ctrl+ shft+ F), poderá encontrar 20 referências ao nome no mesmo arquivo ... e esse nome encontrado fará parte de objetos diferentes. Na janela Resultados da Pesquisa, tudo o que você pode ver é o número da linha e o nome do arquivo. Você precisaria abrir o arquivo e rolar para descobrir em qual objeto a referência encontrada estava.

Qualquer coisa que facilite a depuração, eu gosto.

vbp13
fonte
3

Se você tiver vários projetos em uma solução. Então é melhor criar outro projeto Utilities. Em seguida, crie uma pasta \Enumerationse crie um aninhado static class. E, em seguida, atribua cada classe estática onde você criará uma enumeração que corresponde ao nome de seus projetos. Por exemplo, se você tem um projeto chamado DatabaseReader e DatabaseUsers, pode nomear a classe estática como

public static class EnumUtility {
    #region --Database Readers Enum
    public static class EnumDBReader {
         public enum Actions { Create, Retrieve, Update, Delete}; 
    }
    #endregion

    #region --Database Users Enum
    public static class EnumDBUsers {
         public enum UserIdentity { user, admin }; 
    }
    #endregion

}

A enum inteira que pode ser usada em todas as soluções por projetos será declarada nela. Use # regionpara separar cada preocupação. Por isso, é mais fácil procurar enumerações

Israel Ocbina
fonte
1

Eu gosto de ter um arquivo de enum público chamado E contendo cada enum separado, então qualquer enum pode ser acessado com E ... e eles estão em um local para gerenciar.

Patrick Kafka
fonte