使用相同的参数类型定义两个方法

时间:2011-07-28 12:17:46

标签: c# .net methods parameters overloading

今天我遇到了一个场景,我必须创建一个方法,与现有的方法共享相同的name, params count and params types,像这样:

public static Department GetDepartment(string departmentName)
{
  //LOGIC
}

public static Department GetDepartment(string employeeID)
{
  //LOGIC
}
乍一看,我只是说为什么不用不同的名字命名并完成任务,但我不能!我确实希望保持我正在处理的代码的可读性,我希望它是第一个overloaded, 所以我说为什么不添加一个假参数来解决这个问题从编译器的角度来看。

 public static Department GetDepartment(string employeeID, object fakePassWtEver)
    {
      //LOGIC
    }

此案例的最佳做法是什么?我看到所有方法可以让我的代码运行,但没有一个让我满意

5 个答案:

答案 0 :(得分:33)

维护可读性正是为什么你应该重命名它:

Department GetDepartmentByName(...)

Department GetDepartmentByEmployeeID(...)

现在每当你调用这个方法时,绝对明显你指的是哪一个。如果你重载这个方法,那就非常

随着时间的推移,我越来越不愿意过载 - 有quite a few subtle issues,而且可读性经常会下降。

答案 1 :(得分:5)

您可以通过执行以下操作来更新方法签名并使代码更具可读性。

public static GetDepartmentByName( string departmentName )

public static GetDepartmentByEmployeeId( string employeeId )

就我个人而言,我觉得在代码中添加详细信息可以帮助后来了解其他人的内容。它还有助于使您的方法更容易“阅读”。

答案 2 :(得分:4)

定义2个方法:

  1. public static Department GetDepartmentByDepartmentName(string departmentName)
  2. public static Department GetDepartmentByEmployeeID(string employeeID)

答案 3 :(得分:0)

有点晚了,但是有可能,我今天有完全一样的情况(构造函数重载,因此无法更改名称)。这是我的做法,小技巧,但是它使我所有与LINQ相关的谓词都位于同一位置:

public BusinessStructureFilterSpecification(int responsibilityTypeId, bool dummy1 = true) : base(x => x.ResponsibleGroups.Any(x1 => x1.ResponsibilityTypeId == responsibilityTypeId))
{
    AddIncludes();
}

public BusinessStructureFilterSpecification(int userId, string dummy2 = "") : base(x => x.ResponsibleUsers.Any(x1 => x1.UserId == userId))
{
    AddIncludes();
}

现在的诀窍是使用类似这样的参数名称来调用它们:

if (responsibiltyTypeId.HasValue && !userId.HasValue)
    spec = new BusinessStructureFilterSpecification(responsibilityTypeId: responsibiltyTypeId.Value);

if (!responsibiltyTypeId.HasValue && userId.HasValue)
    spec = new BusinessStructureFilterSpecification(userId: userId.Value);

答案 4 :(得分:-1)

如果您可以通过检查参数以某种方式区分员工ID和部门名称,那么另一种选择是委托给其他方法。

public static Department GetDepartment(string employeeIdOrDepartmentName) {
    if (LooksLikeEmployeeID(employeeIdOrDepartmentName))
        return GetDepartmentByEmployeeID(employeeIdOrDepartmentName);
    else
        return GetDepartmentByDepartmentName(employeeIdOrDepartmentName);
}

private static Department GetDepartmentByEmployeeID(string employeeId) {
    /* ... */
}

private static Department GetDepartmentByDepartmentName(string departmentName) {
    /* ... */
}

如果你绝对不能为了清晰度添加另一种方法,你应该这样做 - 其他答案是100%的点。