如何创建类型安全的数字类型?

时间:2018-10-25 14:49:58

标签: c# types

上下文

假设我正在编写一个有关蛋糕的应用程序。
我需要存储蛋糕的重量(以千克为单位)和它们的FCR(糖霜/巧克力比。我做了计算)。我可以将这些值存储为float。我看到的问题是我可以为FCR字段分配kg-in-weight值

C#的类型系统可以防止此类错误。如果我创建一个class WeightInKg和一个class FrostingChocolateRatio,则无法将一个分配给另一个。

问题

然后,我将需要再次实现所有数字运算符(+ - * / > < ==等)。这些已经很烦人了,因为它们只是float功能的包装。但是,由于这些结构都是基于float的,所以所有这些包装方法实际上都是相同的。其他所有基于float的类型也将再次出现这种情况。

我尝试过/想到的

  • 良好的旧OO继承。 abstract class FloatValue可以提供所有数值运算,但是这些运算将返回FloatValue类型而不是(类型安全的)子类类型。我还觉得应该将struct用于本质上是准系统值的东西,并且struct不支持子类。
  • 泛型。我目前正在使用它; struct Quantity<T>,其中实现了所有数字运算。然后,对于T,我使用空的“标记类”,该标记类仅用于标识某种数量的类型(例如FrostingChocolateRatio)。这可以工作,但是不断使用Quantity<WhatIReallyWant>会很尴尬,并在代码中产生更多视觉混乱。

问题

这是否离我想要的距离很近,或者是否有更干净的方法在C#中具有此类类型安全的值?

加法

正如PaulF所述,FrostingChocolateRatio并不是理想的示例,因为数学对比率的工作方式有所不同。但是,我今天没有创造力。只是假设它的功能与WeightInKg完全相同。
关键是,有几种不同类型的值的行为与float完全一样,但是在公升中添加厘米是没有意义的。

0 个答案:

没有答案