Tenho várias constantes que meu programa usa ... string
's, int
' s, double
's, etc ... Qual é a melhor maneira de armazená-las? Acho que não quero um Enum
, porque os dados não são todos do mesmo tipo e quero definir cada valor manualmente. Devo apenas armazená-los todos em uma classe vazia? Ou há um modo melhor?
97
Respostas:
Você provavelmente poderia tê-los em uma classe estática, com propriedades estáticas somente leitura.
fonte
IMO usando uma classe cheia de constantes é bom para constantes. Se eles mudarem de vez em quando, recomendo usar AppSettings em sua configuração e a classe ConfigurationManager.
Quando eu tenho "constantes" que são realmente extraídas de AppSettings ou semelhante, ainda terei uma classe "constantes" que encerra a leitura do gerenciador de configuração. É sempre mais significativo ter ao
Constants.SomeModule.Setting
invés de ter que recorrer diretamente aConfigurationManager.AppSettings["SomeModule/Setting"]
qualquer lugar que queira consumir o referido valor de configuração.Pontos de bônus para esta configuração, uma vez
SomeModule
que provavelmente seria uma classe aninhada dentro do arquivo Constants, você poderia facilmente usar a injeção de dependência para injetarSomeModule
diretamente em classes que dependem dele. Você também pode extrair uma interfaceSomeModule
e, em seguida, criar uma dependênciaISomeModuleConfiguration
em seu código de consumo, isso permitiria que você desacoplasse a dependência dos arquivos Constants e até mesmo tornaria os testes mais fáceis, especialmente se essas configurações vierem de AppSettings e você os altera usando transformações de configuração porque as configurações são específicas do ambiente.fonte
O que eu gosto de fazer é o seguinte (mas certifique-se de ler até o fim para usar o tipo adequado de constantes ):
Leia isto para saber por que
const
pode não ser o que você deseja. Os possíveis tipos de constantes são:const
Campos. Não use em assemblies (public
ouprotected
) se o valor pode mudar no futuro porque o valor será codificado em tempo de compilação nesses outros assemblies. Se você alterar o valor, o valor antigo será usado pelos outros assemblies até que sejam recompilados.static readonly
Camposstatic
propriedade semset
fonte
Esta é a melhor forma IMO. Não há necessidade de propriedades ou somente leitura:
fonte
Uma classe estática vazia é apropriada. Considere o uso de várias classes, de modo que você termine com bons grupos de constantes relacionadas, e não um arquivo gigante Globals.cs.
Além disso, para algumas constantes int, considere a notação:
Isso permite tratar os valores como sinalizadores .
fonte
Outro voto para usar web.config ou app.config. Os arquivos de configuração são um bom lugar para constantes como strings de conexão, etc. Prefiro não ter que olhar a fonte para ver ou modificar esses tipos de coisas. Uma classe estática que lê essas constantes de um arquivo .config pode ser um bom meio-termo, pois permitirá que seu aplicativo acesse esses recursos como se estivessem definidos no código, mas ainda oferece a flexibilidade de tê-los em um formato facilmente visualizável / editável espaço.
fonte
Sim, um
static class
para armazenar constantes seria suficiente, exceto para constantes relacionadas a tipos específicos.fonte
Se essas constantes forem referências de serviço ou opções que afetam o comportamento do aplicativo, eu as configuraria como configurações do usuário do aplicativo. Dessa forma, se eles precisarem ser alterados, você não precisará recompilar e ainda poderá referenciá-los por meio da classe de propriedades estáticas.
fonte
Eu sugeriria uma classe estática com somente leitura estática. Encontre o snippet de código abaixo:
fonte