通常我的方法如下:
public ListMethod1(int input) { var output = new List (); //add some items to output return output; }
但是FxCop建议另一个IList实现而不是List,但我不记得哪个.替代方案包括将其作为IList,ICollection或IEnumerable返回以获得更大的灵活性或完全不同的方式,如下面的代码:
public int[] Method2(int input) { var output = new List(); //add some items to output return output.ToArray(); }
在所有替代品中,所有提供的和所有可能性,被认为是最佳做法?
IEnumerable/IEnumerable
§8.3.1中的"框架设计指南"(第2版)对于作为返回值的集合有很多说法,摘要:
不要提供可设置的集合属性.
请使用Collection
或Collection
属性的子类或返回表示读/写集合的值.
DO使用ReadOnlyCollection
,子类ReadOnlyCollection
,或在极少数情况下IEnumerable
使用表示只读集合的属性或返回值.
(以及更多,但这三个捕获核心).
上面的第一个:不要返回对内部集合的引用,除非您希望用户能够更改它(然后您可能应该有一个自定义类型,以便您有一定程度的控制).
我会返回IList
并确保我没有定义我返回的实际类型,除非我返回一个迭代器(当我使用时IEnumerable
).
Eric Lippert有一篇很好的文章说明为什么返回数组通常是一个坏主意.
通常情况下,你应该尽可能地保持一般性,而不会给那些打电话给你方法的人带来过度的悲伤.首选接口通过具体类,并选择最常用的接口.
返回接口可以更好地封装您的实现,并使将来更容易更改.如果从具体类型开始,则承诺始终返回该类型.
IEnumerable
是最好的起点.随着LINQ的出现,调用者只有在枚举的情况下才能轻松完成.如果呼叫者偶尔需要一个列表,则很容易打电话.ToList()
.
如果调用者可能特别需要索引返回的集合,或者他们可能想要自己修改集合(插入/删除/重新排序项目),请考虑使用IList
.