У меня есть проект с большим количеством вычислений, включающий много реальных единиц:
- Расстояние;
- Температура;
- Расход;
- ...
Этот проект включает в себя сложные и многочисленные формулы расчета.
Вот почему я предположил, что использование пользовательских типов, таких как Температура , Расстояние ... может быть полезным для читабельности кода. Например:
Temperature x = -55.3;
Meter y = 3;
или
var x = new Temperature(-55.3);
Я пытался создать класс температуры, который использует двойное внутреннее значение.
public class Temperature
{
double _Value = double.NaN;
public Temperature() { }
public Temperature(double v) {
_Value = v;
}
public static implicit operator Temperature(double v) {
return new Temperature(v);
}
}
Но класс обнуляем. Это означает, что что-то вроде:
Temperature myTemp;
является «правильным» и будет нулевым. Я не хочу этого. Я не хочу использовать структуры, потому что они слишком ограничены:
- Они не могут использовать конструктор без параметров или инициализаторы полей экземпляра, такие как
double _Value = double.Nan;
, чтобы определить значение по умолчанию (я задаю значение по умолчанию для двойного значения NaN)
- Они не могут наследовать от классов, они могут только реализовывать интерфейсы
Им интересно, есть ли способ сказать C #:
Temperature myTemp = 23K; // C# does not implement anything to make K unit...
но я знаю, что C # не обрабатывает никакие пользовательские единицы.
Temperature myTemp = new Kelvin(23); // This might work
Итак, я представляю, что могу создать два класса Цельсия и Кельвина, которые наследуются от Температуры, и затем я начал задаваться вопросом, действительно ли идея того стоит, потому что она требует большого количества кодирования и тестирования.
Вот обсуждение, которое я хотел бы начать:
Было бы полезным использование в моем коде модулей реального мира вместо типов .NET или нет? Кто-нибудь уже это делал? Каковы подводные камни и лучшие практики? Или мне лучше держаться подальше от этого и использовать стандартные типы .NET?