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);).
哪种方法更有效?它们是否彼此"高效"?它没有任何区别,因为它只有一个参考传递?或者传递的参考在某种程度上有所不同?
我问的原因是因为我选择了当前项目中的第一个方法签名 - 而且我已经完成了,因为在以后我们可能需要使用我们'人'的其他字段 - 所以更容易扩展/适应性方法是我所拥有的 - 但它是一个更昂贵的方法吗?
编辑:注意 - 不言而喻,这些差异将是微不足道的,否则我已经遇到的情况是性能影响明显足以让我采取行动.这只是一个好奇的问题.
表现明智,他们将是相同的.在这两种情况下,您都传递一个引用(具有相同的性能成本),并且在这两种情况下,您都是PersonType从其中一个字段中获取对象.
这里唯一的区别在于代码可读性/可维护性等.通常,方法最好只接受他们需要的信息.如果你只需要一个,PersonType那么只接受一个PersonType.它允许更灵活地使用该方法.(如果除了a以外的东西Person有PersonType什么?)如果你认为你实际上需要的不仅仅是人的类型而不是接受a Person可能是合适的.
还要注意,即使这里存在差异,它肯定会很小.你不应该考虑每一个小小的想法来运行它的成本.这些天电脑很快.即使是糟糕的算法也往往花费很少的时间在实践中运行(从一个人的角度来看).如果你的程序运行时间比你需要的时间长,那么就该开始寻找需要改进的地方了.您应该关注代码的这些区域(使用分析器标识)作为处理器时间的重要百分比.网络通信(包括数据库调用)和其他IO往往是优化的良好目标.
另请注意,拥有公共字段通常被认为是不好的做法.至少,您应该拥有公共属性.