我知道这个问题的“逻辑方法”......
逻辑上正确:
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实例时是否有任何性能损失?
我有一个基础方法,大部分时间都会在不同的类中调用,所以我试图在这里权衡性能与逻辑。但如果没有什么可以担心性能的话,那么选择就变得合乎逻辑了(哈哈...惩罚)。
答案 0 :(得分:3)
就方法调用而言,任何性能损失都不足以解决问题。更重要的是它对你的程序的可维护性的影响。
如果您将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,而是因为你需要生成一个Employee
感兴趣的是身份证。
最终,您必须根据您对所使用方法的预期做出此决定。
答案 1 :(得分:2)
如果Employee
是class
,则.NET传递引用(基本上是指针)而不是实例本身......所以性能与实际实例方法非常相似(也是接收对实例的引用,作为名为this
的隐式参数。
您甚至可以将它们定义为Extension Methods,如:
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();
答案 2 :(得分:0)
我实际上会同时执行depFindBy(int employeeId)和depFindBy(Employee employee)。没有多少工作,以后可以方便地使用这两种方法。