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

本文关键字:值传 方法 对象 实例 我应该 | 更新日期: 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

最终,你必须根据你对使用该方法的期望做出决定。

如果Employeeclass,那么.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)。工作不多,以后同时使用这两种方法会很方便。