C# 我应该传递整个对象实例还是只传递所需的值到方法中?

C# 我应该传递整个对象实例还是只传递所需的值到方法中?,c#,performance,methods,C#,Performance,Methods,我知道这个问题的“逻辑方法” 这在逻辑上是正确的: 。。。因为部门实际上是以员工为基础的,而以下逻辑上是不正确的: 。。。因为该方法实际上不是员工的函数。。。它只是一个整数修饰符 所有这些都说明了(如果我出于某种原因在这一点上犯了错误,请随意指出),在传递整个Employee实例时,是否有任何性能损失 我有一个基本的方法,大部分时间都会在不同的类中调用,所以我在这里试图权衡性能和逻辑。但是如果在性能方面没有什么可担心的,那么选择就变得合乎逻辑了(哈哈…很小)。如果Employee是类,那么.NE

我知道这个问题的“逻辑方法”

这在逻辑上是正确的:

。。。因为部门实际上是以员工为基础的,而以下逻辑上是不正确的:

。。。因为该方法实际上不是员工的函数。。。它只是一个整数修饰符

所有这些都说明了(如果我出于某种原因在这一点上犯了错误,请随意指出),在传递整个Employee实例时,是否有任何性能损失


我有一个基本的方法,大部分时间都会在不同的类中调用,所以我在这里试图权衡性能和逻辑。但是如果在性能方面没有什么可担心的,那么选择就变得合乎逻辑了(哈哈…很小)。

如果
Employee
,那么.NET传递的是一个引用(基本上是一个指针),而不是实例本身。。。因此,性能与实际实例方法非常相似(它也接收对实例的引用,作为名为
this
的隐式参数)

您甚至可以将它们定义为:

然后像调用
Employee
实例上的任何实例方法一样调用它:

Employee emp = ...;

Department dep = emp.FindDepartment();

如果
Employee
,那么.NET传递的是引用(基本上是指针),而不是实例本身。。。因此,性能与实际实例方法非常相似(它也接收对实例的引用,作为名为
this
的隐式参数)

您甚至可以将它们定义为:

然后像调用
Employee
实例上的任何实例方法一样调用它:

Employee emp = ...;

Department dep = emp.FindDepartment();

就方法调用本身而言,任何性能损失都不足以产生影响。更重要的是它对程序可维护性的影响

如果将
Employee
作为参数,则在调用您的方法之前,必须始终确保有人拥有en
Employee
。一方面,这有助于避免人们在方法中传递错误的
int
变量时出现错误:

int plusOne = GetPlusOne(emp.DirectReportId); // oops, didn't you mean EmployeeId?
另一方面,如果我只有员工的ID,这可能会很烦人,现在我必须进行某种数据库访问,从中生成一个实际的员工对象

foreach(var pinkSlip in pinkSlips)
{
    var employee = GetEmployee(pinkSlip.EmployeeId); // ugh, is this really necessary?
    int plusOne = GetPlusOne(employee);
    ...
}
如果
GetEmployee
做了一些昂贵的事情,比如数据库往返,那么上面的代码可能会非常慢:不是因为调用GetPlusOne,而是因为当您只关心ID时,您必须生成一个
Employee


最终,您必须根据您对所讨论的方法的预期使用方式来做出决定。

就方法调用本身而言,任何性能损失都不足以产生影响。更重要的是它对程序可维护性的影响

如果将
Employee
作为参数,则在调用您的方法之前,必须始终确保有人拥有en
Employee
。一方面,这有助于避免人们在方法中传递错误的
int
变量时出现错误:

int plusOne = GetPlusOne(emp.DirectReportId); // oops, didn't you mean EmployeeId?
另一方面,如果我只有员工的ID,这可能会很烦人,现在我必须进行某种数据库访问,从中生成一个实际的员工对象

foreach(var pinkSlip in pinkSlips)
{
    var employee = GetEmployee(pinkSlip.EmployeeId); // ugh, is this really necessary?
    int plusOne = GetPlusOne(employee);
    ...
}
如果
GetEmployee
做了一些昂贵的事情,比如数据库往返,那么上面的代码可能会非常慢:不是因为调用GetPlusOne,而是因为当您只关心ID时,您必须生成一个
Employee


最终,您必须根据您对所讨论的方法的预期使用方式来做出此决定。

我实际上会同时执行depFindBy(int-employeeId)和depFindBy(Employee-Employee)。没有太多的工作,而且以后两种方法都可以方便地使用。

我实际上会同时使用depFindBy(int employeeId)和depFindBy(Employee)。工作不多,以后两种方法都可以方便使用。

为什么不将其定义为扩展方法呢?一个好的经验法则是,在出现问题之前,永远不要担心性能。当这种情况发生时,使用分析来查看瓶颈在哪里——它们几乎总是不在您预期的地方!为什么不把它定义为一个扩展方法呢?一个很好的经验法则是在它成为问题之前不要担心性能。当这种情况发生时,使用分析来查看瓶颈在哪里——它们几乎总是不在您预期的地方!谢谢你的回答。。。很有见地,谢谢你的回答。。。这是很有见地的。谢谢你提醒我它们是作为指针传递的。我肯定我在编程课上学到了这一点,但我已经忘记了。没有玩过扩展方法。。。看起来很有趣,可能会玩弄它们,看看它们是否是我的场景的方法。谢谢提醒,它们被作为指针传递。我肯定我在编程课上学到了这一点,但我已经忘记了。没有玩过扩展方法。。。看起来很有趣,可以玩弄它们,看看它们是否适合我的场景。