传递对象的字段而不是整个对象本身是否“昂贵”?

时间:2012-10-04 16:07:40

标签: c# methods parameter-passing pass-by-reference

考虑以下课程:

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);调用)。

哪种方法更有效?它们是否彼此“高效”?它没有任何区别,因为它只有一个参考传递?或者传递的参考文献是否有所不同?

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

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

5 个答案:

答案 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 使用这个方法,还要你还需要它为另一个“类型”你必须为它重写另一个方法,面向对象编程的目标,即代码减少,将消失。