Определение цветов как констант в C # - PullRequest
16 голосов
/ 21 марта 2011

Я установил некоторые цвета по умолчанию в приложении winforms C #, например:

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

Насколько я знаю, readonly по сути является константой для моих целей. Если я пытаюсь определить их как константы, компилятор указывает, что это должна быть константа времени компиляции, а это не Color.

Хорошо ли я оставить все как есть или есть какой-то способ определить эти константы, о которых мне следует знать?

(Цель состоит в том, чтобы просто иметь единственное место, в котором можно изменить все цвета для целей регистрации.)

Ответы [ 6 ]

22 голосов
/ 21 марта 2011

Только литералы могут быть определены как const.Разница в том, что const значения жестко запекаются в сборках, которые его используют.Если их определение изменится, то сайты вызовов не заметят, пока они не будут перекомпилированы.

В отличие от этого, readonly объявляет переменную таким образом, что ее нельзя переназначить после выхода за пределы конструктора * 1009.* (или статический конструктор в случае переменной static readonly).

Таким образом, у вас нет другого способа использовать здесь только для чтения, поскольку Color является структурой и не имеет примитивного типа данных или литерала.

4 голосов
/ 21 марта 2011
Поле

A const является константой compile time - вам действительно нужен код для запуска, чтобы определить значение Color.Orange, хотя, внутренне, вероятно, определено как

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

Поскольку это не может быть вычислено во время компиляции, ваша единственная опция - readonly, которая устанавливается во время выполнения.

Также ознакомьтесь с этой статьей .

2 голосов
/ 14 октября 2014

Вы можете определить статические цвета, как это:

// tested with C# 5.0
static const Color ERROR = Color.FromArgb(0, 255,0);
static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua);
1 голос
/ 21 марта 2011

Помимо технических аспектов, которые упоминали другие (что const значения заменяются во время компиляции в местах, где они используются, и должны быть литералами, а не static readonly значениями, которые назначаются и на которые ссылаются во время выполнения ) необходимо рассмотреть семантическую проблему.

Причина, по которой const значения заменяются во время компиляции, заключается в том, что const действительно означает "постоянный" - как в значении, которое никогда и никогда не изменится, например, pi или е . Вот почему их безопасно заменять во время компиляции, потому что имя представляет собой вечно неизменное значение.

То, что вы заявляете ...

Цель состоит в том, чтобы просто иметь единственное место, в котором можно изменить все цвета для целей регистрации.

... указывает, что они не являются семантически постоянными и, следовательно, не должны определяться как const, даже если это было возможно сделать.

1 голос
/ 21 марта 2011

Вы могли бы по крайней мере сделать их статичными. Только для чтения поле - это просто поле, которое может быть назначено только во время инициализации. Он не дает никаких гарантий относительно того, что представленное значение доступно только для чтения.

0 голосов
/ 21 марта 2011

Это хорошо, и вы не можете сделать лучше (как говорит вам компилятор).

Но сделайте их static, если их еще нет.

...