我的项目涉及许多包含很多现实世界单位的计算:
- 距离;
- 温度;
- 流量;
- ...
这个项目涉及复杂的和众多的计算公式。
因此,我认为使用自定义类型,如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;
"correct"会是null,但我不想要这个。我不想使用结构体因为它们太受限制:
- 它们不能使用无参构造函数或实例字段初始化器(例如
double _Value = double.Nan;
)来定义默认值(我希望默认底层double值为NaN) - 它们不能继承类,只能实现接口
因此,我想知道是否有一种方法可以告诉C#:
Temperature myTemp = 23K; // C# does not implement anything to make K unit...
但我知道C#无法处理没有自定义单位的情况。
Temperature myTemp = new Kelvin(23); // This might work
我想我可以创建两个继承自Temperature的Celsius和Kelvin类,但我开始思考这个想法是否真的值得,因为这需要大量的编码和测试。
这就是我想要开始讨论的问题:
在我的代码中使用真实世界的单位而不是.NET类型是否是一件好事?是否有人已经这样做过?有哪些陷阱和最佳实践?还是我最好远离这个并使用标准的.NET类型?