C# 是不是少了';昂贵';通过一个物体的场而不是整个物体本身?

C# 是不是少了';昂贵';通过一个物体的场而不是整个物体本身?,c#,methods,parameter-passing,pass-by-reference,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.Pe

考虑以下类别:

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

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

哪种方法更有效?它们是否都像对方一样“高效”?因为它只是传入的一个引用,所以没有区别吗?或者传递的引用在某些方面有所不同

我问这个问题的原因是因为我选择了当前项目中的第一个方法签名——我这么做是因为以后我们可能需要使用“人”的其他字段——所以我得到了一个更容易扩展/适应性更强的方法——但这是一个更昂贵的方法吗


编辑:注意——不用说,这些差异将是微不足道的,否则,如果性能影响足够明显,我就已经遇到了可以采取行动的场景。这只是好奇的问题。

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

这里唯一的区别是在代码可读性/可维护性等方面。一般来说,方法最好只接受它们需要的信息。如果您只需要
个人类型
,则只接受
个人类型
。它允许更灵活地使用该方法。(如果
以外的其他人有
人类型
?)如果您认为您实际上需要的不仅仅是人类型,那么接受
可能更合适

还要注意的是,即使这里有差异,也肯定很小。你不应该考虑每一个小问题,而应该考虑到跑步有多贵。现在计算机速度很快。即使是糟糕的算法,在实践中也往往只需要很少的时间(从一个人的角度来看)。如果您的程序运行的时间比需要的时间长,那么是时候开始寻找改进的地方了。您应该将重点放在代码中占处理器时间很大比例的那些区域(用分析器标识)。网络通信(包括数据库调用)和其他IO往往是很好的优化目标


还要注意的是,拥有公共字段通常被认为是不好的做法。至少,您应该改为使用公共属性。

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

这里唯一的区别是在代码可读性/可维护性等方面。一般来说,方法最好只接受它们需要的信息。如果您只需要
个人类型
,则只接受
个人类型
。它允许更灵活地使用该方法。(如果
以外的其他人有
人类型
?)如果您认为您实际上需要的不仅仅是人类型,那么接受
可能更合适

还要注意的是,即使这里有差异,也肯定很小。你不应该考虑每一个小问题,而应该考虑到跑步有多贵。现在计算机速度很快。即使是糟糕的算法,在实践中也往往只需要很少的时间(从一个人的角度来看)。如果您的程序运行的时间比需要的时间长,那么是时候开始寻找改进的地方了。您应该将重点放在代码中占处理器时间很大比例的那些区域(用分析器标识)。网络通信(包括数据库调用)和其他IO往往是很好的优化目标


还要注意的是,拥有公共字段通常被认为是不好的做法。至少,您应该改为使用公共属性。

您决定传递给方法的任何内容都将取决于上下文。如果在同一类中的方法之间传递参数,性能影响将非常小,如果在RMI上调用方法,则是另一回事

无论您决定传递给该方法,性能影响都将取决于上下文。如果在同一个类中的方法之间传递参数,那么性能影响将非常小;如果在RMI上调用方法,则这是另一回事。

大概,StaffType是一个枚举。在这种情况下,它应该比传递对象引用稍微高效一些,枚举将为垃圾收集创建更少的工作


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

大概StaffType是一个枚举。在这种情况下,它应该比传递对象引用稍微高效一些,枚举将为垃圾收集创建更少的工作


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

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

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

(如果
StaffType
是一个大的
struct
,则传递速度会慢一些,但实际问题是设计糟糕的
struct
,而不是如何使用它。)

所以,你应该使用最有意义的方法。通常你应该尽可能少地发送信息,只是为了
public void DoSomethingWithPersonType(StaffType personType)
{
    TestMethod(personType)
}