Определение цветов как констант в С#
Я установил некоторые цвета по умолчанию в приложении winforms С#, например:
readonly Color ERROR = Color.Red;
readonly Color WARNING = Color.Orange;
readonly Color OK = Color.Green;
Насколько мне известно, readonly по существу является постоянной для моих целей. Если я попытаюсь определить их как константы, компилятор указывает, что это должна быть константа времени компиляции, которой не является цвет.
Хорошо ли оставить эти as-is или есть способ определить эти константы, о которых я должен знать?
(Цель состоит в том, чтобы просто иметь одно местоположение, в котором можно изменить все цвета для целей ведения журнала.)
Ответы
Ответ 1
Только литералы могут быть определены как const
. Разница заключается в том, что значения const
жестко зажаты в сборках, которые его используют. Если их определение изменится, тогда сайты вызовов не заметят, если они не будут перекомпилированы.
В отличие от этого readonly
объявляет переменную таким образом, что ее нельзя переназначить после внешнего конструктора (или статического конструктора в случае переменной static readonly
).
Итак, у вас нет другого способа использовать readonly здесь, так как Color - это структура, а не примитивный тип данных или литерал.
Ответ 2
A const
- константа compile time
- вам действительно нужен код для запуска, чтобы определить значение Color.Orange
, хотя внутренне вероятно определено как
public static readonly Color Orange = new Color(...);
Так как это невозможно вычислить во время компиляции, единственным вариантом является readonly
, который устанавливается во время выполнения.
Также проверьте эту статью.
Ответ 3
Вы могли бы, по крайней мере, сделать их статичными. В противном случае поле только для чтения - это поле, которое может быть назначено только во время инициализации. Он не гарантирует, что представленное значение будет "только для чтения".
Ответ 4
Помимо технических аспектов, о которых говорили другие (значения const
заменяются во время компиляции в тех местах, где они используются, и должны быть литералами, а не static readonly
значениями, которые назначаются и ссылаются во время выполнения ) есть семантическая проблема для рассмотрения.
Значения const
заменяются во время компиляции, так как const
действительно означает "константа" - как в значении, которое никогда не будет изменяться, например, pi или e. Поэтому безопасно заменять их во время компиляции, потому что имя представляет неизменное значение навсегда.
Тот факт, что вы заявляете...
Цель состоит в том, чтобы иметь единственное место, в котором можно изменить все цвета для целей ведения журнала.
... указывает, что они не являются семантически постоянными и поэтому не должны определяться как const
, даже если это возможно.
Ответ 5
Вы можете определить статические цвета следующим образом:
// tested with C# 5.0
static const Color ERROR = Color.FromArgb(0, 255,0);
static const Color MYPOOL = Color.FromKnownColor(KnownColor.Aqua);
Ответ 6
Это прекрасно, и вы не можете сделать ничего лучше (как компилятор говорит вам).
Но сделайте их static
, если они еще не были.