我应该使用属性或方法计算值吗?

时间:2011-06-10 16:36:35

标签: c# properties semantics

  

可能重复:
  Properties vs Methods

我有一些矢量几何类,并且有很多功能我不知道是否实现为(只读)属性或方法。例子包括:

Vector.Length                   or              Vector.Length()
Vector.Perpendicular            or              Vector.Perpendicular()
Matrix.Determinant              or              Matrix.Determinant()
Matrix.Inverse                  or              Matrix.Inverse()

我应该将这些作为方法或属性来实现吗?他们都没有改变他们适用的对象,因此在这方面,他们似乎适合作为属性。另一方面,它们涉及计算(尽管是小的 - 这是2D几何),这显然对属性不利。

在这种情况下,我应该使用哪些规则吗?

4 个答案:

答案 0 :(得分:5)

属性用于启用Uniform Access Principle,因此,只要您进行一些计算,属性就是最佳选择。这是因为它们是描述对象而不是对对象做事而不需要任何外部计算参数的东西。

有了变异的权利,getter不应该变异,并且setter可能会根据Command Query Separation Principle变异。

答案 1 :(得分:4)

我会将Vector.LengthMatrix.Determinant作为属性来实现,因为它们需要非常轻量级的计算(2D)。

但是,Matrix.InverseVector.Perpendicular不适合恕我直言,因为他们没有描述对象。他们正在返回一个恰好符合某些数学条件的新物体。我将这些实现为Vector.GetPerpendicular()Matrix.GetInverse()

但当然,这只是个人品味。我会这样做,但完全可以将它们全部作为属性来实现。

答案 2 :(得分:1)

通常人们认为属性不是太昂贵而无法调用,并且它们将在接近恒定的时间内完成。听起来你对房产没什么问题。

答案 3 :(得分:0)

人们通常希望方法花费一些时间来执行(并且可能会抛出),而对于属性来说则不那么真实。

例如,您更有可能将属性作为for循环中的条件而不是在那里查看方法。预计方法会产生副作用,而预期属性不会改变对象。

根据经验,如果您对您的财产执行数百次感到满意,那么它们就可以了。

如果你使用方法,它可能会帮助你称之为GetXxx()。