1

考虑以下类:

public class Person
{
    public String FirstName;
    public String LastName;
    public DateTime DateOfBirth;
    public StaffType PersonType;
}

以及以下2个方法和方法调用:

public void DoSomethingWithPersonType(Person person)
{
    TestMethod(person.PersonType);
}

(由 调用DoSomethingWithPersonType(person);

public void DoSomethingWithPersonType(StaffType personType)
{
    TestMethod(personType)
}

(由 调用DoSomethingPersonType(person.PersonType);)。

哪种方法更有效?他们都像彼此一样“高效”吗?它没有什么区别,因为它只是传递了一个引用吗?或者传递的参考是否在某些方面有所不同?

我问的原因是因为我在当前项目中选择了第一个方法签名 - 我已经这样做了,因为以后我们可能需要使用我们的“人”的其他字段 - 所以更容易扩展/适应性强的方法是我所拥有的——但它是一种更昂贵的方法吗?

编辑:注意 - 不用说,这些差异将是微不足道的,否则我已经遇到了性能影响明显足以让我采取行动的情况。这只是一个好奇的问题。

4

5 回答 5

8

在性能方面,它们将是相同的。在这两种情况下,您都传递了一个引用(具有相同的性能成本),并且在这两种情况下,您都将PersonType对象从其中一个字段中取出。

这里唯一的区别在于代码的可读性/可维护性等方面。一般来说,方法最好只接受它们需要的信息。如果你只需要 aPersonType那么只接受 a PersonType。它允许更灵活地使用该方法。(如果 a 以外的东西Person有 aPersonType怎么办?)如果您认为您实际上需要的不仅仅是 person 类型,而不是接受 aPerson可能是合适的。

另请注意,即使此处存在差异,也肯定会很小。您不应该从运行成本的角度考虑每一个小想法。这些天计算机速度很快。即使是糟糕的算法也往往需要很少的时间在实践中运行(从一个人的角度来看)。如果你的程序运行时间超过了它需要的时间,那么是时候开始寻找改进的地方了。您应该关注那些占处理器时间很大比例的代码区域(使用分析器识别)。网络通信(包括数据库调用)和其他 IO 往往是优化的好目标。

另请注意,拥有公共字段通常被认为是不好的做法。至少,您可能应该拥有公共属性。

于 2012-10-04T16:10:58.390 回答
2

无论您决定传递给方法的性能影响如何,都取决于上下文。如果您在同一类中的方法之间传递参数,性能影响将非常小,如果您通过 RMI 调用方法,则另当别论

于 2012-10-04T16:12:00.297 回答
2

这在一定程度上取决于 的类型StaffType,但通常性能差异可以忽略不计。

如果StaffType是一个类,那么没有任何区别,因为两者都是引用。如果是,enum那么传递一个StaffType值比传递一个引用要快一些。

(如果StaffType是一个大的struct,那么它会更慢通过,但实际的问题是一个糟糕的设计struct,而不是你如何使用它。)

所以,你应该使用最有意义的那个。通常您应该发送尽可能少的信息,以便更容易看到该方法实际使用的内容。是否应该发送StaffType值或整个Person对象以供将来可能的扩展很难说,但请考虑YAGNI原则 - 你不需要它。

于 2012-10-04T16:20:35.467 回答
1

据推测,StaffType 是一个枚举。在这种情况下,它应该比传递对象引用更有效,枚举将为垃圾收集创建更少的工作。

但是任何差异都可以忽略不计,在这种情况下,我认为可扩展性更为重要。

于 2012-10-04T16:14:28.107 回答
0

说到效率,它们是相等的,因为在这两种情况下你都会传递一个引用(说到两个类,否则如果StaffType是一个结构,那么第二个会更慢)。但就最佳编码实践而言,这取决于你想做什么。如果您不需要Person该类中的任何其他属性,则应使用第二个,因为您应该传递尽可能少的信息,但是如果您必须在 person 对象上做更多工作,则应该使用第一个解决方案。

但是您必须考虑方法和框架的可重用性,假设您不仅需要将此方法用于Person 类型,而且还需要将其用于另一种“类型”,您必须重写另一种方法它和面向对象编程的目标,即代码更少,将消失。

于 2012-10-04T16:20:50.617 回答