我很有兴趣让我的数字类型更“强大”,例如,double
值可以专门用于表示不同的东西。不幸的是,在C#中,我能想到的最好的是写using Real = System.Double;
这样的东西,因为没有静态检查,所以没有用。
所以我一直在想这个基本上用struct
值包装数字类型的想法,例如:
struct Real
{
double Value;
public static implicit operator double(Real r) { return r.Value; }
// and so on
}
我的问题:这对性能有何影响?与仅仅咬住子弹并使用double
相比,我是否受到了重大打击?
编辑:我真正想要的是一种定义更多stronly类型数字变体的方法,以便无法使用类型为{{1}的参数调用函数Calculate(Rate rate)
或者甚至Percentage
,就此而言。
答案 0 :(得分:8)
根据我的经验, 会对此产生影响,是的。您可能希望JIT能够有效地使其完全透明,但我不相信它。 (当然,不同版本的CLR在这方面的表现可能不同,未来的版本可能会进一步改进。)
现在关于这个不同的是否重要,你真的需要测试它 - 它将完全是特定于应用程序的。您对这些值做了什么,以及它对整体应用程序性能有多重要?您的必需性能是什么?您的应用程序是否已满足它?如果您没有任何测量,那应该是您的第一个停靠点。
作为一个参考点,在Noda Time中我们有各种结构只包装long
...但API可以从保持这些类型的不同(并使它们与{{ {1}})大量。我非常关心Noda Time中的性能,但我肯定不会改为在任何地方使用long
只是为了提升性能。这都是平衡利弊的问题 - 我们不能为你判断那些。
(我不清楚你的问题是否源于以不同方式处理各种价值观的同一种愿望,即使它们仅由long
支持。我认为这就是你的意思,但值得编辑这个问题以使其更清晰。)