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

Я установил некоторые цвета по умолчанию в приложении 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, если они еще не были.