我应该传递整个对象实例还是仅传递方法所需的值?

时间:2012-01-17 16:01:50

标签: c# performance methods

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

逻辑上正确

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实例时是否有任何性能损失?

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

3 个答案:

答案 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)

如果Employeeclass,则.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)。没有多少工作,以后可以方便地使用这两种方法。