类设计指南中的算术运算符和方法

时间:2009-05-27 17:53:31

标签: c# .net class

我有许多数学类型,比如Point3,我遇到了实现算术运算符,实例和静态方法的困境。

所以说类型是Point3。如果a,b,c是Point3,我肯定能够说:

c = a + b;

但我是否也应该实施:

c = Point3.Add (a, b);

而且:

c = a.Add (b);

对我来说,#3没有用,也没有#1那么可读。除非你有一个Add,Subtract,Multiply,Divide等接口,否则#2看起来毫无意义。

你推荐什么?有运营商(+, - ,*,/)有任何问题或缺点吗?这会妨碍泛型算法(我知道它不直接支持它,但是在解决方法中使用静态方法会有用吗?)

这个问题的指导方针是一个类还是一个结构?

编辑:对于#3,我忘了提到这是一个不可变类型,所以返回一个新的Point3,而不是改变一个。

3 个答案:

答案 0 :(得分:3)

总的来说,我认为微软似乎在他们的大多数类中都做了类似的事情。

对于示例,请参阅整个System.Windows.Media.Media3D命名空间以及XNA数学类。两者都有point / vector / quaternion / matrices / etc,并使用Class.Operator(a,b),偶尔也会做c = a + b;

就我个人而言,我会先做第一个有意义且清晰的事情,并且总是做第二个选择。我通常使用第二个选项实现第一个(操作符使用静态方法实现)。

答案 1 :(得分:2)

使用操作员重载来满足您的需求。要支持不支持重载运算符的.NET语言,请包含用于包装运算符的静态方法(或其他方式)。 第三个选项仅在您使用引用类型并且希望避免实例化新引用时才可行。

答案 2 :(得分:1)

诸如VB.NET之类的语言没有像C#这样的运算符重载,所以它们需要像Point3.Add(a, b)这样的静态方法来提供加法和其他算术运算。如果您希望您的类型符合CLR,则必须通过提供这些方法实现来支持这些其他语言。

虽然VB.NET(和其他语言)程序员可以在编译+重载时调用use the op_Addition,但访问Add方法更好。每个运营商This MSDN section describes the alternative method names

您描述的第三个选项不是CLS合规性所必需的。