我应该将整个对象实例还是仅将所需的值传递到方法中
本文关键字:值传 方法 对象 实例 我应该 | 更新日期: 2023-09-27 18:20:38
我知道这个问题的"逻辑方法"。。。
这在逻辑上是正确的:
public static Department FindDepartment(Employee emp)
{
if(emp.ID > 500)
{
return new Department("Department for Over 500");
}else{
return new Department("Department for 500 and under");
}
}
因为部门实际上是以员工为基础的,而以下内容在逻辑上是不正确的:
public static int GetPlusOne(Employee emp)
{
return emp.ID + 1;
}
因为该方法实际上不是Employee的函数。。。它只是一个整数修饰符。
话虽如此(如果我出于某种原因在这方面有错误,请随时指出),在传递Employee的整个实例时,是否会损失任何性能?
我有一个底层方法,它大部分时间都会在不同的类中被调用,所以我试图在这里权衡性能和逻辑。但是,如果在性能方面没有什么可担心的,那么选择就变得合乎逻辑了(哈哈……小意思)。
就方法调用本身而言,任何性能损失都不够重要。更重要的是它对程序可维护性的影响。
如果将Employee
作为参数,则必须始终确保有人拥有en Employee
,然后才能调用您的方法。一方面,这有助于避免人们将错误的int
变量传递到您的方法中的错误:
int plusOne = GetPlusOne(emp.DirectReportId); // oops, didn't you mean EmployeeId?
另一方面,如果我只有员工的ID,那么这可能会很烦人,现在我必须进行某种数据库访问,才能从中生成一个实际的employee对象
foreach(var pinkSlip in pinkSlips)
{
var employee = GetEmployee(pinkSlip.EmployeeId); // ugh, is this really necessary?
int plusOne = GetPlusOne(employee);
...
}
如果GetEmployee
做一些昂贵的事情,比如数据库往返,上面的代码可能会非常慢:不是因为对GetPlusOne的调用,而是因为当你只感兴趣的是ID时,你必须生成Employee
。
最终,你必须根据你对使用该方法的期望做出决定。
如果Employee
是class
,那么.NET传递一个引用(基本上是一个指针),而不是实例本身。。。因此性能与实际实例方法相当相似(它也接收到对实例的引用,作为名为this
的隐式参数)。
您甚至可以将它们定义为扩展方法,如:
public static Department FindDepartment(this Employee emp)
{
if(emp.ID > 500)
{
return new Department("Department for Over 500");
}else{
return new Department("Department for 500 and under");
}
}
然后像调用Employee
:实例上的任何实例方法一样调用它
Employee emp = ...;
Department dep = emp.FindDepartment();
我实际上会同时做depFindBy(int employeeId)和depFindBy(Employee Employee)。工作不多,以后同时使用这两种方法会很方便。