Определение цветов как констант в C#

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

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

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

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

6 ответов


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

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

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


A


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


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

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

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

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

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


вы можете определить статические цвета следующим образом:

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

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

но сделайте их static, если они уже не.