c# - 如何强制字段/属性代表某种类型的物理量?

标签 c#

在某些类型的代码(例如模拟/游戏/优化)中,对象的许多物理量/属性被存储、操作和暴露(位置、速度、距离、面积、体积、时间、时差)。在这些类型的代码中,所有这些数量通常由 float 表示,即 c# 中的 double 。

这允许您将时间与距离、面积与体积、时间与时间以及位置与位置相加。

但是你永远不想这样做。您只需将时差与时间相加,将距离与其他距离或位置相加,并将面积与距离相乘。尽管如此,还是很容易出错,尤其是在由其他人编写代码时。

有很多选择可以减轻这种危险。您可以定义代表各种物理量的自定义类,然后以编程方式禁止某些类型的交互。或者您遵守严格的命名约定(例如delay_timedifference)。在什么(如果有)情况下这两个选项中哪一个最好?如何实现第一个选项?如何为第二个选项命名?

最佳答案

通常使用第二个选项,但更多的是为了方便。命名变成了使您正在处理的内容变得明显的问题,即:命名属性 AreaVolume,但即便如此,仍然存在单位问题。

您可以通过创建一整套自定义类(或不可变结构类型)来处理每种不同的组合来处理第一种情况,这可以很好地工作,但可能会使代码使用起来更加麻烦。框架中的 DateTime 结构就是一个很好的例子 - 从本质上讲,它基本上只是一个长整型值,但它被包装到一个结构中,以防止将其用作除时间之外的任何内容。

请注意,其他语言对此有选项 - 例如,F# 允许 Units在语言级别进行处理,但 C# 中不以任何方式支持这一点。

关于c# - 如何强制字段/属性代表某种类型的物理量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11264610/

相关文章:

c# - 如何存储类型 A 和运行时 Func<A,B> 类型转换之间的映射?

c# - C# 中多线程网络服务器的模式

c# - 使用正则表达式分隔多部分电子邮件

c# - 多个进程并行运行时的 Selenium WebDriver 异常

c# - 简易喷油器 : Registering a type with constructor argument that's based on its parent

c# - 如果我不知道旧密码,如何更改密码?

c# - 如果隐式已在 C# 中重载,则重载显式运算符是否有好处?

c# - Entity Framework 4.0 如何确定实体的工厂方法需要哪些参数?

c# - 另一个子类的子类可以从c#中的基类继承方法吗

c# - 将编辑后的数据按行保存