【发布时间】:2011-02-26 02:11:50
【问题描述】:
我现在正在开发一个系统,该系统处理语义上不同的值之间的大量转换,这些值具有相同的原始 .NET 类型(double/string/int)。这意味着您可能会因为不转换或转换太多次而对您使用的“语义类型”感到困惑。理想情况下,如果我尝试使用在语义上没有意义的值,我希望编译器发出警告/错误。
一些例子来说明我指的是什么:
- 角度可以以度或弧度为单位,但两者都由
double表示。 - 向量位置可能在局部/全局坐标中,但两者都由
Vector3D结构表示。 - 想象一个接受各种查询参数作为字符串的 SQL 库。最好有一种方法来强制在运行时只允许传入干净的字符串,而获得干净字符串的唯一方法是通过一些 SQL 注入攻击防止逻辑。
我相信 F# 对此有一个编译时解决方案(称为度量单位。)我想在 C# 中做类似的事情,尽管我不需要 F# 中的度量单位提供的维度分析。
我相信 C++ 可以使用 typedef 实现这一点(尽管我不是 C++ 专家)。
显而易见的解决方案是将 double/string/whatever 包装在一个新类型中,以提供编译器所需的类型信息。我很好奇是否有人有替代解决方案。如果您确实认为换行是唯一/最好的方法,那么请谈谈该模式的一些缺点(以及我也没有提到的任何优点。)我特别关心抽象原始数字类型在我的运行时计算,所以无论我想出什么解决方案,无论是在内存分配还是调用调度方面,都必须是轻量级的。
【问题讨论】:
-
F# 中的 AFAIK 度量单位只是编译器技巧。尝试在示例程序中使用它们,然后将其反编译为 C#。我想它会给你很好的提示它是如何实现的。
-
@Andrey - 每个 语言特性只是一个编译器技巧。这就是重点
-
@Scott,我认为@Andrey 的意思是在 F# 中编译后这个技巧就消失了。具体来说,在 F# 中没有对单元的运行时检查,因为在 CLR 上会对所有 .NET 语言中的类型进行运行时检查。
-
@Hans,我不认为这是重复的。我不需要 F# 的维度分析。这种简化的假设使解决方案变得更容易和更站得住脚。我只提到计量单位是为了让我的解释更清楚。
标签: c# .net performance type-systems