2010-08-25 116 views
2

有人告诉我,但我没有看到这个地方,我已经用完了所有,我不明白为什么它会是不好的做法。使用泛型作为函数的返回值是不好的做法吗?

我的意思是具有诸如示例:

public List<SomeCustomeType> GetListOfStuff() 
{ 
} 

public void DoSomeStuff(List<SomeCustomeType> param) 
{ 

} 

谁能告诉我,为什么会这样不好的做法应该被使用? 谢谢!

+0

我不确定我是否完全理解了这个问题。但可能他们可能指的是使用List <>而不是IList <> ...正如我所说的,不太确定是什么意思 - 对不起:) – 2010-08-25 15:03:59

+0

没有问题只是在返回类型或参数中使用T类型:像Bla 或IeNumerable 词典等 谢谢 – codewrath 2010-08-25 15:24:12

回答

6

封闭和开放泛型类型可以在框架中使用,应该使用。如果您使用的是不正确的类型或者不需要公开的功能,那么这可能是不好的做法 - 例如,最好返回IList<T>,然后List<T>,因为那样您就不会绑定到实现,并且可以使用实现的任何类型IList<T>

以类似的方式,您应该只使用公开所需minumun的类型 - 如果您只需要枚举返回的列表,则最好返回IEnumerable<T>而不是IList<T>

+0

是的,这也是我的理解,我想看看是否有人在其他阵营。谢谢。 – codewrath 2010-08-25 15:22:08

0

不,这不坏。不过,使用通用接口IList<T>比通用类List<T>更好。

+0

为什么不只是返回一个IEnumerable或ICollection? – 2010-08-25 15:02:37

+0

返回ReadOnlyCollection 更好。 – 2010-08-25 15:02:54

+0

@ the_drow:因为会员的消费者可能需要使用'List '或'IList '特定成员。出于同样的原因,不要返回'object' – abatishchev 2010-08-25 15:04:19

0

第一个比较好。很显然,该方法创建新列表并返回它, 不清楚是谁负责创建第二个版本列表,以及如果它不是空的将会发生什么......

2

在LINQ及其相关扩展方法的时代,返回IEnumerable<T>被认为是最佳实践,即使底层集合实现了IList<T>。当底层集合是IList<T>时,LINQ扩展方法Count()ElementAt()都有优化,所以对性能的影响通常可以忽略不计。

这种做法将客户端代码与您如何管理集合的细节隔离开来(也许您将来希望使用不同类型的集合?)遵循此模式时要考虑的主要问题是清楚地记录你是否正在进行某种形式的有状态惰性评估,可能需要客户自行缓存结果(例如使用ToArray())。

相关问题