J'ai plusieurs constantes que mon programme utilise ... string
, int
, double
, etc ... Quelle est la meilleure façon de les stocker? Je ne pense pas que je veux un Enum
, car les données ne sont pas du même type et je veux définir manuellement chaque valeur. Devrais-je juste les stocker tous dans une classe vide? Ou y a-t-il un meilleur moyen?
Vous pourriez probablement les avoir dans une classe statique, avec des propriétés statiques en lecture seule.
public static class Routes
{
public static string SignUp => "signup";
}
OMI en utilisant une classe pleine de constantes est très bien pour les constantes. S'ils changeront de temps en temps, je vous recommande d'utiliser AppSettings dans votre configuration et la classe ConfigurationManager.
Quand j'ai des "constantes" qui sont réellement extraites d'AppSettings ou similaire, j'ai toujours une classe "constantes" qui encapsule la lecture du gestionnaire de configuration. C'est toujours plus significatif d'avoir Constants.SomeModule.Setting
au lieu d’avoir directement recours à ConfigurationManager.AppSettings["SomeModule/Setting"]
sur tout lieu qui souhaite utiliser ladite valeur de réglage.
Points bonus pour cette configuration, puisque SomeModule
serait probablement une classe imbriquée dans le fichier de constantes, vous pouvez facilement utiliser Dependency Injection pour injecter directement SomeModule
dans les classes qui en dépendent. Vous pouvez également même extraire une interface au-dessus de SomeModule
, puis créer une dépendance à ISomeModuleConfiguration
dans votre code consommateur, ce qui vous permettrait ensuite de découpler la dépendance aux fichiers constants, et même potentiellement faciliter les tests, en particulier si ces paramètres proviennent d'AppSettings et que vous les modifiez à l'aide de transformations de configuration, car ils sont spécifiques à l'environnement.
Ce que j'aime faire, c'est ce qui suit (mais assurez-vous de lire jusqu'au bout pour utiliser le bon type de constantes ):
internal static class ColumnKeys
{
internal const string Date = "Date";
internal const string Value = "Value";
...
}
Lisez ceci pour savoir pourquoi const
pourrait ne pas être ce que vous voulez. Les types possibles de constantes sont:
const
champs. Ne pas utiliser dans les assemblages (public
ou protected
) si la valeur pourrait changer à l'avenir car la valeur sera codée en dur au moment de la compilation dans ces autres assemblées. Si vous modifiez la valeur, l'ancienne valeur sera utilisée par les autres assemblys jusqu'à ce qu'ils soient recompilés.static readonly
des champsstatic
propriété sans set
C’est la meilleure façon pour l’OMI. Pas besoin de propriétés, ou en lecture seule:
public static class Constants
{
public const string SomeConstant = "Some value";
}
Une classe statique vide est appropriée. Pensez à utiliser plusieurs classes afin de vous retrouver avec de bons groupes de constantes connexes, et non pas un seul fichier Globals.cs géant.
De plus, pour certaines constantes int, considérons la notation:
[Flags]
enum Foo
{
}
Comme cela permet de traiter les valeurs comme des drapeaux .
Un autre vote pour l'utilisation de web.config ou app.config. Les fichiers de configuration sont un bon emplacement pour les constantes telles que les chaînes de connexion, etc. Je préfère ne pas avoir à regarder la source pour afficher ou modifier ce type de choses. Une classe statique qui lit ces constantes à partir d'un fichier .config peut constituer un bon compromis, car elle permettra à votre application d'accéder à ces ressources comme si elles étaient définies dans le code, tout en vous laissant la possibilité de les avoir dans un format facilement lisible/éditable. espace.
Oui un static class
pour stocker des constantes serait très bien, sauf pour les constantes liées à des types spécifiques.
Si ces constantes sont des références de service ou des commutateurs affectant le comportement de l'application, je les configurerais en tant que paramètres utilisateur de l'application. Ainsi, si elles doivent être modifiées, vous n'avez pas besoin de recompiler et vous pouvez toujours les référencer via la classe de propriétés statiques.
Properties.Settings.Default.ServiceRef
Je suggérerais classe statique avec statique en lecture seule. Veuillez trouver l'extrait de code ci-dessous:
public static class CachedKeysManager
{
public static readonly string DistributorList = "distributorList";
}