使方法的数据类型尽可能具体或更通用是否更好?

时间:2010-09-11 02:21:27

标签: c# asp.net-mvc

在ASP.Net MVC中,如果我在控制器上有一个返回View的方法,那么该方法应该是ViewResult类型还是更一般的ActionResult?

2 个答案:

答案 0 :(得分:4)

在ASP.NET论坛上提出了类似的问题:http://forums.asp.net/t/1423519.aspx

基本上,它归结为样式 - 在OOP中,您尝试返回您可以给出的最具体的类型。对于您拥有的每种方法,您都不会返回object - 有时您会返回string,有时会返回List,有时会返回自定义类。

在论坛的回复中,有人引用了斯蒂芬·沃尔特的书:

  

注意这个动作方法   声明它返回一个实例   ViewResult。它只会起作用   相反,如果方法返回类型   是ActionResult(基类)   所有行动结果)。其实有些   ASP.NET MVC程序员声明了所有   他们的行动方法如返回   非特异性的ActionResult,即使他们   确切地知道它会永远   返回一个特定的子类。   然而,它是一个成熟的   面向对象的原则   编程方法应返回   最具体的类型(如   以及接受最一般的   他们可以参数类型)。以下   这个原则最大化了便利性   和调用代码的灵活性   你的方法,比如你的单元测试。

因此,首选使用更具体的ViewResult,尤其是从单元测试的角度来看。

答案 1 :(得分:2)

当参数尽可能通用时,方法最有用(例如,IEnumerable<T>而不是数组)并且其返回值尽可能具体(例如,IList<T>代替IEnumerable)。

但是,使用返回值,使用接口或抽象类型而不是具体类型(例如,IList<T>而不是List<T>)仍然更好,这将为您提供更改实现的灵活性或至少最小化与调用代码的耦合。

如果您没有预见到将结果更改为任何其他类型的ActionResult,则可以使其返回ViewResult。如果你没有预见到任何调用者特别利用了ViewResult,那么它可以作为ActionResult返回,但这两种方式都无关紧要。