Définition des couleurs en tant que constantes en C #

J’ai configuré certaines couleurs par défaut dans une application winforms C # comme suit:

readonly Color ERROR = Color.Red; readonly Color WARNING = Color.Orange; readonly Color OK = Color.Green; 

Pour autant que je sache, la lecture seule est essentiellement une constante pour moi. Si je tente de les définir en tant que constantes, le compilateur indique qu’il doit s’agir d’une constante au moment de la compilation, ce que Color ne fait pas.

Suis-je capable de les laisser tels quels, ou existe-t-il un moyen de définir ces constantes dont je devrais être au courant?

(Le but est simplement d’avoir un seul endroit pour changer toutes les couleurs à des fins de journalisation.)

Seuls les littéraux peuvent être définis en tant que const . La différence est que les valeurs const sont durement intégrées dans les assemblys qui les utilisent. Si leur définition change, les sites d’appel ne le remarquent que s’ils sont recompilés.

En revanche, readonly déclare une variable d’une manière telle qu’elle ne puisse pas être réaffectée après l’extérieur du constructeur (ou du constructeur statique dans le cas d’une variable static readonly ).

Vous n’avez donc pas d’autre moyen d’utiliser readonly ici, car Color est une structure, et aucun type de données primitif ou littéral.

Un champ const est une constante de comstack time . Vous avez en fait besoin de code pour déterminer la valeur de Color.Orange , probablement défini en interne comme

 public static readonly Color Orange = new Color(...); 

Comme cela ne peut pas être calculé au moment de la compilation, votre seule option est en readonly et est définie à l’exécution.

Consultez également cet article .

Vous pourriez au moins les rendre statiques. Sinon, un champ en lecture seule est simplement un champ, qui ne peut être atsortingbué qu’à l’initialisation. Il ne fait aucune garantie que la valeur représentée soit “en lecture seule”.

Outre les aspects techniques mentionnés par d’autres (que les valeurs const soient remplacées au moment de la compilation aux endroits où elles sont utilisées et doivent être littérales plutôt que static readonly valeurs static readonly atsortingbuées et référencées à l’exécution), il existe un problème sémantique à envisager.

La raison pour laquelle les valeurs const sont remplacées au moment de la compilation est que const signifie en réalité “constant” – comme dans une valeur qui ne changera jamais, telle que pi ou e . C’est pourquoi il est prudent de les remplacer au moment de la compilation, car le nom représente une valeur immuable.

Le fait que vous déclariez …

Le but est simplement d’avoir un seul endroit pour changer toutes les couleurs à des fins de journalisation.

… indique que celles-ci ne sont pas sémantiquement constantes et ne devraient donc pas être définies comme const même s’il était possible de le faire.

Vous pouvez définir des couleurs statiques comme ceci:

 // tested with C# 5.0 static const Color ERROR = Color.FromArgb(0, 255,0); static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua); 

C’est bien, et vous ne pouvez pas faire mieux (comme le dit le compilateur).

Mais rendez-les static , s’ils ne le sont pas déjà.