在某些类型的代码(例如模拟/游戏/优化)中,对象的许多物理量/属性被存储、操作和暴露(位置、速度、距离、面积、体积、时间、时差)。在这些类型的代码中,所有这些数量通常由 float 表示,即 c# 中的 double 。
这允许您将时间与距离、面积与体积、时间与时间以及位置与位置相加。
但是你永远不想这样做。您只需将时差与时间相加,将距离与其他距离或位置相加,并将面积与距离相乘。尽管如此,还是很容易出错,尤其是在由其他人编写代码时。
有很多选择可以减轻这种危险。您可以定义代表各种物理量的自定义类,然后以编程方式禁止某些类型的交互。或者您遵守严格的命名约定(例如delay_timedifference)。在什么(如果有)情况下这两个选项中哪一个最好?如何实现第一个选项?如何为第二个选项命名?
最佳答案
通常使用第二个选项,但更多的是为了方便。命名变成了使您正在处理的内容变得明显的问题,即:命名属性 Area
和 Volume
,但即便如此,仍然存在单位问题。
您可以通过创建一整套自定义类(或不可变结构类型)来处理每种不同的组合来处理第一种情况,这可以很好地工作,但可能会使代码使用起来更加麻烦。框架中的 DateTime
结构就是一个很好的例子 - 从本质上讲,它基本上只是一个长整型值,但它被包装到一个结构中,以防止将其用作除时间之外的任何内容。
请注意,其他语言对此有选项 - 例如,F# 允许 Units在语言级别进行处理,但 C# 中不以任何方式支持这一点。
关于c# - 如何强制字段/属性代表某种类型的物理量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11264610/