从动作方法返回最具体或最通用的类​​型是否更好?

时间:2010-08-08 12:54:50

标签: c# asp.net-mvc return-type actionmethod

两者的好处或坏处是什么?

2 个答案:

答案 0 :(得分:22)

我的指南一直是最具体的,最常见的是。

您的数据类型越通用,使用它的代码就越了解数据类型。例如,如果方法返回一个集合,我将返回该方法生成的新创建的集合。如果它返回一个内部数据结构,我会将其提升到IEnumerable<T>

但是,如果它返回一个数组或List<T>,因为它是内部构建的,那么获取数据的代码现在可以访问集合中的更多功能。

频谱的另一端,返回最常规(在限制范围内)数据类型意味着您始终为所有集合返回IEnumerable<T>或类似内容,即使该方法在内部构建了一个新数组并返回。调用代码现在必须手动将集合的内容复制到新的数组或列表中,如果这是调用代码需要使用的话。

这意味着更多,在大多数情况下,这是不必要的工作。

至于输入,我选择最常用的类型,所以对于集合,除非我特别需要数组或列表或类似内容,否则我会接受IEnumerable<T>。通过这样做,我确保调用代码的工作量较少。这可能意味着我必须在内部做一些工作,所以这是一个权衡。

重要的是达到平衡。每次都不要太笼统或太具体。找出合理的类型,并考虑调用代码必须做什么才能传入数据或接受代码中的传出数据。工作越少越好。

答案 1 :(得分:2)

一般来说,我会选择更通用的类型。这样我就不会破坏任何可能使用返回类型信息的客户端。

如果我返回一个更通用的类型,在action方法的实现中我总是可以将类型更改为不同的类型。请考虑以下情形:您返回从ActionResult派生的自定义操作结果。在代码库的某处,某些事情会假设返回值为MyCustomActionResult。在这种情况下,如果您更改了返回值,则会破坏客户端代码。

BTW:我也这样做 - 返回最合适的通用类型 - 所有方法不仅适用于动作方法。

修改:请注意,这并不意味着我会返回object。挑战在于找到代表“最合适”抽象的类型。