C# 我应该传递整个对象实例还是只传递所需的值到方法中?
我知道这个问题的“逻辑方法” 这在逻辑上是正确的: 。。。因为部门实际上是以员工为基础的,而以下逻辑上是不正确的: 。。。因为该方法实际上不是员工的函数。。。它只是一个整数修饰符 所有这些都说明了(如果我出于某种原因在这一点上犯了错误,请随意指出),在传递整个Employee实例时,是否有任何性能损失C# 我应该传递整个对象实例还是只传递所需的值到方法中?,c#,performance,methods,C#,Performance,Methods,我知道这个问题的“逻辑方法” 这在逻辑上是正确的: 。。。因为部门实际上是以员工为基础的,而以下逻辑上是不正确的: 。。。因为该方法实际上不是员工的函数。。。它只是一个整数修饰符 所有这些都说明了(如果我出于某种原因在这一点上犯了错误,请随意指出),在传递整个Employee实例时,是否有任何性能损失 我有一个基本的方法,大部分时间都会在不同的类中调用,所以我在这里试图权衡性能和逻辑。但是如果在性能方面没有什么可担心的,那么选择就变得合乎逻辑了(哈哈…很小)。如果Employee是类,那么.NE
我有一个基本的方法,大部分时间都会在不同的类中调用,所以我在这里试图权衡性能和逻辑。但是如果在性能方面没有什么可担心的,那么选择就变得合乎逻辑了(哈哈…很小)。如果
Employee
是类
,那么.NET传递的是一个引用(基本上是一个指针),而不是实例本身。。。因此,性能与实际实例方法非常相似(它也接收对实例的引用,作为名为this
的隐式参数)
您甚至可以将它们定义为:
然后像调用Employee
实例上的任何实例方法一样调用它:
Employee emp = ...;
Department dep = emp.FindDepartment();
如果
Employee
是类
,那么.NET传递的是引用(基本上是指针),而不是实例本身。。。因此,性能与实际实例方法非常相似(它也接收对实例的引用,作为名为this
的隐式参数)
您甚至可以将它们定义为:
然后像调用Employee
实例上的任何实例方法一样调用它:
Employee emp = ...;
Department dep = emp.FindDepartment();
就方法调用本身而言,任何性能损失都不足以产生影响。更重要的是它对程序可维护性的影响 如果将
Employee
作为参数,则在调用您的方法之前,必须始终确保有人拥有enEmployee
。一方面,这有助于避免人们在方法中传递错误的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
作为参数,则在调用您的方法之前,必须始终确保有人拥有enEmployee
。一方面,这有助于避免人们在方法中传递错误的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)。工作不多,以后两种方法都可以方便使用。为什么不将其定义为扩展方法呢?一个好的经验法则是,在出现问题之前,永远不要担心性能。当这种情况发生时,使用分析来查看瓶颈在哪里——它们几乎总是不在您预期的地方!为什么不把它定义为一个扩展方法呢?一个很好的经验法则是在它成为问题之前不要担心性能。当这种情况发生时,使用分析来查看瓶颈在哪里——它们几乎总是不在您预期的地方!谢谢你的回答。。。很有见地,谢谢你的回答。。。这是很有见地的。谢谢你提醒我它们是作为指针传递的。我肯定我在编程课上学到了这一点,但我已经忘记了。没有玩过扩展方法。。。看起来很有趣,可能会玩弄它们,看看它们是否是我的场景的方法。谢谢提醒,它们被作为指针传递。我肯定我在编程课上学到了这一点,但我已经忘记了。没有玩过扩展方法。。。看起来很有趣,可以玩弄它们,看看它们是否适合我的场景。