У меня есть проект со многими вычислениями, включающими множество единиц реального мира:
- Расстояние
- Температура;
- Расход,
- ...
Этот проект включает сложные и многочисленные формулы расчета.
Вот почему я предположил, что использование настраиваемых типов, таких как Temperature, Distance..., может быть хорошим для чтения кода. Например:
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;
для определения значения по умолчанию (I wand по умолчанию для двойного значения является NaN) - Они не могут наследовать от классов, они могут реализовать интерфейсы
Им интересно, есть ли способ сказать С#:
Temperature myTemp = 23K; // C# does not implement anything to make K unit...
но я знаю, что С# не обрабатывает никаких настраиваемых единиц.
Temperature myTemp = new Kelvin(23); // This might work
Итак, я предполагаю, что могу создать два класса Цельсия и Кельвина, которые наследуются от температуры, а затем я начал задаваться вопросом, действительно ли это стоит, потому что это связано с большим количеством кодирования и тестирования.
Это обсуждение, которое я хотел бы начать:
Будет ли использование реальных единиц в моем коде вместо типов .NET, было бы хорошо или нет? Кто-нибудь это уже? Каковы подводные камни и лучшие практики? Или мне лучше держаться подальше от этого и использовать стандартные типы .NET?