1
41
您缺少维度分析。例如(从链接到的答案),在F中可以执行以下操作:
它将产生一个新的加速度单位,从米和秒导出(实际上你可以用模板在C++中做同样的事情)。
是否值得做当然取决于应用,但对于许多科学应用来说,这绝对是个好主意。我不知道.NET的任何现有的库,但它们可能存在。 如果您对如何在运行时执行此操作感兴趣,则其思想是每个值都有一个标量值和表示每个基本单元的幂的整数。
如果不允许用户更改单位的值(无论如何,这是个好主意),可以为公共单位添加子类:
还可以在派生类型上定义更具体的运算符,以避免检查公共类型上的兼容单元。 |
2
18
可以在数值类型上添加扩展方法以生成度量值。感觉有点像DSL:
它不是真正的.NET约定,也可能不是最容易被发现的功能,所以也许您可以将它们添加到专门为喜欢它们的人提供的命名空间中,并提供更常规的构造方法。 |
3
17
对同一度量单位的不同单位使用不同的类(例如,cm、mm和ft表示长度)似乎有点奇怪。基于.NET Framework的DateTime和TimeSpan类,我希望如下所示:
|
4
11
http://www.codeproject.com/Articles/413750/Units-of-Measure-Validator-for-Csharp 它与F的单元编译时验证功能几乎相同,但对于C。 核心是一个MSBuild任务,它解析代码并寻找验证。 单元信息存储在注释和属性中。 |
5
10
|
6
4
我关心的是用C#/VB创建单元。如果你认为我错了,请纠正我。我读过的大多数实现似乎都涉及到创建一个将一个值(int或double)与一个单元组合在一起的结构。然后,尝试为这些结构定义基本函数(+-*/,等等),其中考虑了单位转换和一致性。
尽管试图把单元逻辑推向背景,但C语言中的一些繁琐的符号似乎是不可避免的。F#做一些幕后魔术,更好地减少单位逻辑的烦恼因素。 另外,如果我们不使用CType或“.Value”或任何附加符号,那么如何成功地使编译器像对待普通的double一样对待一个单元呢?例如对于空值,代码知道如何处理double吗?就像一个双人间(当然,如果你的双人间?如果为空,则会出现错误)。 |
7
3
谢谢你的主意。我已经用C#很多不同的方法实现了单元,似乎总有一个陷阱。现在我可以用上面讨论的想法再试一次。我的目标是能够基于现有的类来定义新的单元。
并为程序找出合适的尺寸、比例和符号来使用。最后,我需要建立一个基本的代数系统,它可以转换像
此外,还必须能够以不需要对新单元进行编码的方式序列化单元,而只需在如下XML文件中声明:
|
8
1
http://jscience.org/ ,下面是一个groovy dsl单元: http://groovy.dzone.com/news/domain-specific-language-unit- . iirc,c有闭包,所以你应该可以拼凑一些东西。 |
9
1
为什么不使用CodeDom自动生成所有可能的单元排列呢?我知道这不是最好的-但我一定会工作! |
10
1
你可以使用QuantitySystem而不是自己实现它。它建立在F#的基础上,极大地提高了F#的单位处理能力。这是迄今为止我发现的最好的实现,可以用于C#项目。 |
11
0
|
12
0
我非常喜欢阅读这个堆栈溢出问题及其答案。 我有一个宠物项目,多年来我一直在修改,最近开始重新编写,并将其发布到 http://ngenericdimensions.codeplex.com
它基本上是关于创建泛型维度,使用度量单位和本机数据类型作为泛型类型占位符。 例如:
以及
新单元可以在您自己的库中扩展。 这些数据类型是只包含1个内部成员变量的结构,使它们成为轻量级的。 基本上,运算符重载仅限于“维度”结构,因此每个度量单位都不需要运算符重载。
其主要目的是能够以编译时检查的方式修饰与单元的接口。 图书馆有很多事情要做,但我想把它寄出去,以防有人在找这种东西。 |
Thomas · 使类型别名在F中不可互换# 2 年前 |
sdgfsdh · 我该怎么说。使用异步转换函数进行收集? 6 年前 |
Soldalma · 我可以实例化包含顶级副作用值的类吗? 6 年前 |
matekus · F#-包含数字的字符串的自然排序 6 年前 |
matekus · F#类型匹配-无法创建映射或匹配记录 6 年前 |
Rob Lyndon · 未找到F#ProvidedTypes文件 6 年前 |
red-swan · 如何将intro ML.Net演示翻译为F#? 6 年前 |
jkone27 · F#-在编译时从字符串生成简单的空类型 6 年前 |