Если вы собираетесь его изменить, вы должны использовать readonly
здесь. const
действительно нужно использовать для вещей, которые будут никогда изменить, как π. Причина этого - из-за тонкой разницы между const
и readonly
.
Основная проблема заключается в том, что если вы измените значение const
, вы должны перекомпилировать всех зависимых клиентов, которые используют const
, в противном случае вы можете shoot yourself in the foot, badly. Так что для значений, которые может изменить, не использовать const
, используйте readonly
.
Таким образом, если значение никогда изменится, просто использовать const
, а затем не беспокоиться об определении Epsilon
в терминах ROUND
, просто сказать:
internal const int ROUND = 3;
public const double Epsilon = 1e-3;
Если вы действительно хотите сделать что вы случайно не изменить один, не изменяя другие, вы могли бы добавить небольшую проверку в конструкторе:
if (Epsilon != Math.Pow(10, -ROUND)) {
throw new YouForgotToChangeBothConstVariablesException();
}
можно даже добавить условную компиляцию так тх t только компилируется в отладочных версиях.
Если это собирается изменить, используйте static readonly
:
internal readonly int ROUND = 3;
public static readonly double Epsilon = Math.Pow(10, -ROUND);
С этим ограничением я не вижу, как я могу определить как interdependant константы, как consts. [...] Не хватает ли я очевидного способа сделать это?
Нет, вам нужно сделать какое-то математику с помощью Math.Pow
или Math.Log
идти между ROUND
и Epsilon
и теми, кто не является приемлемым для использования во время компиляции с const
.Вы могли бы написать генератор миниатюрного кода, чтобы выплюнуть эти две строки кода на основе одного входного значения, но я действительно сомневаюсь в стоимости времени инвестирования.
Что такое буквальная ошибка? – rae1
Вы на самом деле делаете математику для 'Epsilon', не создавая значения 0.001. –
Что не так с использованием поля 'readonly'? – xxbbcc