考虑以下课程:
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);
调用)。
哪种方法更有效?它们是否彼此“高效”?它没有任何区别,因为它只有一个参考传递?或者传递的参考文献是否有所不同?
我问的原因是因为我选择了当前项目中的第一个方法签名 - 而且我已经完成了,因为在以后我们可能需要使用我们'人'的其他字段 - 所以更多容易扩展/适应性强的方法是我所拥有的 - 但它是一个更昂贵的方法吗?
编辑:注意 - 不言而喻,这些差异将是微不足道的,否则我已经遇到的情况是性能影响明显足以让我采取行动。这只是好奇心问题。
答案 0 :(得分:8)
性能明智,他们将是相同的。在这两种情况下,您都会传递一个引用(具有相同的性能成本),并且在这两种情况下,您都会从其中一个字段中获取PersonType
对象。
这里唯一的区别在于代码可读性/可维护性等。通常,方法只接受他们需要的信息是最好的。如果您只需要PersonType
,则只接受PersonType
。它允许更灵活地使用该方法。 (如果Person
之外的其他内容有PersonType
,该怎么办?)如果您认为您实际上需要的不仅仅是个人类型,而是接受Person
可能是合适的。< / p>
另请注意,即使这里存在差异,它肯定会很小。你不应该考虑每一个小小的想法来运行它的成本。这些天电脑很快。即使是糟糕的算法也往往花费很少的时间在实践中运行(从一个人的角度来看)。如果你的程序运行时间比你需要的时间长,那么现在是时候开始寻找需要改进的地方了。您应该关注代码的这些区域(使用分析器标识)作为处理器时间的重要百分比。网络通信(包括数据库调用)和其他IO往往是优化的良好目标。
另请注意,拥有公共字段通常被视为不良做法。至少,您应该拥有公共属性。
答案 1 :(得分:2)
无论您决定传递给方法,性能影响都取决于上下文。如果你在同一个类中的方法之间传递参数,那么性能影响将是无法估量的,如果你在RMI上调用一个方法则是另一回事
答案 2 :(得分:2)
这在某种程度上取决于StaffType
的类型,但通常性能差异可以忽略不计。
如果StaffType
如果是一个类,则没有任何差异,因为两者都是引用。如果它是enum
,则传递StaffType
值而不是参考值的速度会快一些。
(如果StaffType
是一个很大的struct
,那么通过它会更慢,但实际问题是设计错误的struct
,而不是你如何使用它。)< / p>
所以,你应该使用最有意义的那个。通常,您应该尽可能少地发送信息,以便更容易看到方法实际使用的内容。您是否应该发送StaffType
值或整个Person
对象以便将来可能扩展很难说,但请考虑YAGNI原则 - 您不需要它。
答案 3 :(得分:1)
据推测,StaffType是一个枚举。在这种情况下,它应该比传递对象引用更有效,枚举将减少垃圾收集工作。
但任何差异都可以忽略不计,在这种情况下,我认为可扩展性更为重要。
答案 4 :(得分:0)
说到效率,它们是平等的,因为在这两种情况下你都会传递一个引用(说两个类,否则如果StaffType
是一个结构,第二个会慢一些)。但就最佳编码惯例而言,这取决于您想要做什么。如果你不需要Person
类中的任何其他属性,你应该使用第二个属性,因为你应该尽可能少地传递信息,但如果你需要在person对象上做更多的工作,你应该使用第一个解。
但是你必须考虑方法和框架的 re-usability ,假设你不仅要为 Person type 使用这个方法,还要你还需要它为另一个“类型”你必须为它重写另一个方法,面向对象编程的目标,即代码减少,将消失。