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

1 c# methods parameter-passing pass-by-reference

考虑以下课程:

public class Person
{
    public String FirstName;
    public String LastName;
    public DateTime DateOfBirth;
    public StaffType PersonType;
}
Run Code Online (Sandbox Code Playgroud)

以下2种方法和方法调用:

public void DoSomethingWithPersonType(Person person)
{
    TestMethod(person.PersonType);
}
Run Code Online (Sandbox Code Playgroud)

(称为DoSomethingWithPersonType(person);)

public void DoSomethingWithPersonType(StaffType personType)
{
    TestMethod(personType)
}
Run Code Online (Sandbox Code Playgroud)

(被称为DoSomethingPersonType(person.PersonType);).

哪种方法更有效?它们是否彼此"高效"?它没有任何区别,因为它只有一个参考传递?或者传递的参考在某种程度上有所不同?

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

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

Ser*_*rvy 8

表现明智,他们将是相同的.在这两种情况下,您都传递一个引用(具有相同的性能成本),并且在这两种情况下,您都是PersonType从其中一个字段中获取对象.

这里唯一的区别在于代码可读性/可维护性等.通常,方法最好只接受他们需要的信息.如果你只需要一个,PersonType那么只接受一个PersonType.它允许更灵活地使用该方法.(如果除了a以外的东西PersonPersonType什么?)如果你认为你实际上需要的不仅仅是人的类型而不是接受a Person可能是合适的.

还要注意,即使这里存在差异,它肯定会很小.你不应该考虑每一个小小的想法来运行它的成本.这些天电脑很快.即使是糟糕的算法也往往花费很少的时间在实践中运行(从一个人的角度来看).如果你的程序运行时间比你需要的时间长,那么就该开始寻找需要改进的地方了.您应该关注代码的这些区域(使用分析器标识)作为处理器时间的重要百分比.网络通信(包括数据库调用)和其他IO往往是优化的良好目标.

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