J'ai différentes constantes que mon programme utilise ... string
's, int
' s, double
's, etc ... Quelle est la meilleure façon de les stocker? Je ne pense pas que je veuille un Enum
, car les données ne sont pas toutes du même type, et je veux définir manuellement chaque valeur. Dois-je simplement les stocker tous dans une classe vide? Ou y a-t-il un meilleur moyen?
97
Réponses:
Vous pourriez probablement les avoir dans une classe statique, avec des propriétés statiques en lecture seule.
la source
IMO en utilisant une classe pleine de constantes est très bien pour les constantes. S'ils changent de manière semi-occasionnelle, je recommande d'utiliser AppSettings dans votre configuration et la classe ConfigurationManager à la place.
Quand j'ai des "constantes" qui sont réellement extraites d'AppSettings ou similaires, j'aurai 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 à recourir directement àConfigurationManager.AppSettings["SomeModule/Setting"]
n'importe quel endroit qui veut consommer ladite valeur de réglage.Points bonus pour cette configuration, car il
SomeModule
s'agirait probablement d'une classe imbriquée dans le fichier Constantes, vous pouvez facilement utiliser l'injection de dépendances pour injecter soitSomeModule
directement dans les classes qui en dépendent. Vous pouvez même extraire une interface par-dessusSomeModule
et créer une dépendance àISomeModuleConfiguration
dans votre code de consommation, cela vous permettrait alors de découpler la dépendance aux fichiers Constants, et même potentiellement de rendre les tests plus faciles, surtout si ces paramètres proviennent d'AppSettings et vous les modifiez à l'aide de transformations de configuration car les paramètres sont spécifiques à l'environnement.la source
Ce que j'aime faire est ce qui suit (mais assurez-vous de lire jusqu'à la fin pour utiliser le type de constantes approprié ):
Lisez ceci pour savoir pourquoi
const
ce n'est pas ce que vous voulez. Les types de constantes possibles sont:const
des champs. N'utilisez pas entre les assemblys (public
ouprotected
) si la valeur peut changer à l'avenir, car la valeur sera codée en dur au moment de la compilation dans ces autres assemblys. 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é sansset
la source
C'est la meilleure façon IMO. Pas besoin de propriétés, ou en lecture seule:
la source
Une classe statique vide est appropriée. Pensez à utiliser plusieurs classes, de sorte que vous vous retrouviez avec de bons groupes de constantes associées, et non un fichier géant Globals.cs.
De plus, pour certaines constantes int, considérez la notation:
Comme cela permet de traiter les valeurs comme des drapeaux .
la source
Un autre vote pour l'utilisation de web.config ou app.config. Les fichiers de configuration sont un bon endroit pour les constantes comme les chaînes de connexion, etc. Je préfère ne pas avoir à regarder la source pour voir ou modifier ce type de choses. Une classe statique qui lit ces constantes à partir d'un fichier .config peut être un bon compromis, car elle permettra à votre application d'accéder à ces ressources comme si elles étaient définies dans le code, mais vous donnera tout de même la flexibilité de les avoir dans un format facilement consultable / modifiable espace.
la source
Oui, un
static class
pour stocker des constantes serait très bien, sauf pour les constantes liées à des types spécifiques.la source
Si ces constantes sont des références de service ou des commutateurs qui affectent le comportement de l'application, je les configurerais en tant que paramètres utilisateur de l'application. De cette façon, s'ils doivent être modifiés, vous n'avez pas à les recompiler et vous pouvez toujours les référencer via la classe de propriétés statiques.
la source
Je suggérerais une classe statique avec lecture seule statique. Veuillez trouver l'extrait de code ci-dessous:
la source