假设我正在编写一个有关蛋糕的应用程序。
我需要存储蛋糕的重量(以千克为单位)和它们的FCR(糖霜/巧克力比。我做了计算)。我可以将这些值存储为float
。我看到的问题是我可以为FCR字段分配kg-in-weight值。
C#的类型系统可以防止此类错误。如果我创建一个class WeightInKg
和一个class FrostingChocolateRatio
,则无法将一个分配给另一个。
然后,我将需要再次实现所有数字运算符(+ - * / > < ==
等)。这些已经很烦人了,因为它们只是float
功能的包装。但是,由于这些结构都是基于float
的,所以所有这些包装方法实际上都是相同的。其他所有基于float
的类型也将再次出现这种情况。
abstract class FloatValue
可以提供所有数值运算,但是这些运算将返回FloatValue
类型而不是(类型安全的)子类类型。我还觉得应该将struct用于本质上是准系统值的东西,并且struct不支持子类。struct Quantity<T>
,其中实现了所有数字运算。然后,对于T
,我使用空的“标记类”,该标记类仅用于标识某种数量的类型(例如FrostingChocolateRatio
)。这可以工作,但是不断使用Quantity<WhatIReallyWant>
会很尴尬,并在代码中产生更多视觉混乱。这是否离我想要的距离很近,或者是否有更干净的方法在C#中具有此类类型安全的值?
正如PaulF所述,FrostingChocolateRatio
并不是理想的示例,因为数学对比率的工作方式有所不同。但是,我今天没有创造力。只是假设它的功能与WeightInKg
完全相同。
关键是,有几种不同类型的值的行为与float
完全一样,但是在公升中添加厘米是没有意义的。