如何使用这两种特殊的基本类型选择轻松/快速地替换浮点数(例如)以编译为两个不同的目标?
讨论: 我正在开发大量的c#代码,我需要编译,或者根据目标程序集的用例使用float,double或decimal。
使用像“类MYNumber:Double”这样的东西,只需更改一行代码就行了,因为Double是密封的,显然C#中没有#define。 使用#if #else语句来编写代码也不是一个选项,使用这些特定的基元类型的数学运算符/相关代码太多了。
我对如何做这个看似简单的任务感到茫然,谢谢!
编辑:只是一个关于拳击的快速评论在Kyles回复中提到:不幸的是我需要避免装箱,主要是因为当需要最大速度时选择浮动,并且当最大准确度是优先级时小数(并且采取20x +性能打击是可以接受的)。拳击可能会排除小数作为一个有效的选择,并在某种程度上打败目的。
Edit2:作为参考,那些建议将泛型作为这个问题的可能答案的人注意到有许多问题可以计算出泛型(至少对我们的需求而言)。有关概述和进一步参考,请参阅Using generics for calculations
答案 0 :(得分:8)
执行此操作的最佳方法是使用#if作为上面提到的Andrew。但是,一个有趣的想法是这样的:
#if USE_FLOAT
using Numeric = System.Single;
#endif
#if USE_DOUBLE
using Numeric = System.Double;
#endif
#if USE_DECIMAL
using Numeric = System.Decimal;
#endif
public class SomeClass
{
public Numeric MyValue{get;set;}
}
编辑:
我仍然非常喜欢这个解决方案,它允许你做一些其他非常酷的事情,例如:
Numeric.Parse();
Numeric.TryParse();
哪种适用于所有三种类型
答案 1 :(得分:0)
最糟糕的是,我认为你可以使用拳击这样的东西:
#if USE_FLOAT
public float OutputValue(object input)
{
return (float)input;
}
#endif
#if USE_DOUBLE
public double OutputValue(object input)
{
return (double)input;
}
#endif
并致电OutputValue(1.5);
让它为您转换。
答案 2 :(得分:0)
一种方法是在所需的基本类型周围使用泛型。然后,您声明一个类,该类在单独的.cs文件中继承该泛型的特定实例,并为您需要的每种基类型创建此类的三个副本。然后根据构建配置更改.csproj以包含正确的.cs文件。
请注意,我还没有真正尝试过,所以可能会有一些问题需要解决。
答案 3 :(得分:0)
你可以这样做:
public struct NumberContainer<T>
{
T _number;
// accessor, and possibly: operators, cast methods, etc.
}
然后:
#if USE_FLOAT
public struct MyNumber : NumberContainer<float>
#else
public struct MyNumber : NumberContainer<double>
#endif
{
}
答案 4 :(得分:0)
这很难,因为基本类型不会像IArithmetic这样的东西。这是suggested many times on Connect。不幸的是,这是一个well known limitation of generics。
使用"calculator" struct class有一些解决方法。如果数学不是太繁重,那么这非常非常好。
然而,它很笨重。这是一个泛型不如C ++模板灵活的地方。
另一种方法可能是使用类似Text Template Transformation Toolkit (T4)之类的东西来生成适用于任何类型的模板,并为每种类型编译单独的模板。