我应该在重载方法上使用不同的返回类型吗?

Ben*_*ter 5 .net c#

是否有关于在重载方法上返回不同返回类型的最佳实践?例如,如果我在DAL中有一个Load方法,我要么加载一个项目或一堆项目.我知道我可以使用多种方法:

加载一个对象

MyBusinessObject LoadOne(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

加载多个对象

MyBusinessObject[] LoadMany(params int[] ids)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以做的是重载一个方法并具有不同的返回类型.像这样:

MyBusinessObject Load(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

MyBusinessObject[] Load(params int[] ids)
{
}
Run Code Online (Sandbox Code Playgroud)

虽然似乎没有什么可以阻止我这样做,并且从API的角度来看它保持整洁,这看起来是个好主意吗?我昨晚遇到它,部分我认为我不应该这样做是因为想要匹配重载方法的返回类型.

我也可以让Load(int id)方法返回一个只包含一个项目的集合.在我看来,这违反了最少惊喜的原则,但是如果你期望返回一个项目,你应该返回该项目,你不应该返回包含单个项目的列表.

所以这是围绕这些想法的矛盾思想:

  • 重载方法应该都返回相同的类型.
  • 如果方法做同样的事情,不要给它们一堆不同的名称,重载相同的方法名称.从API用户的角度来看,它使事情更简单,他们不必遍历一堆不同的方法,这些方法基本上都做同样的事情,但使用不同的参数.
  • 返回该方法最明显的类型,即如果用户可能期望收集项目,则返回项目集合,如果他们可能期望单个项目,则返回单个项目.

所以后两种想法比第一种想法更重要,但与此同时,第一种想法似乎是一种程序化的最佳实践.

有没有围绕这种做法的最佳做法?我有兴趣听听别人对这个问题的看法.

Mar*_*ell 8

我可能想要明确API并在名称中使用多个:

Customer LoadCustomer(int id) {...}
Customer[] LoadCustomers(params int[] id) {...}
Run Code Online (Sandbox Code Playgroud)

实际上,params这里很少有用 - 你通常不会在编译时知道id.