使用泛型作为函数的返回值是不好的做法吗?

时间:2010-08-25 14:59:28

标签: c# .net generics

有人告诉我这个,但我没有在任何地方看到这个,我已经全部使用过,我不明白为什么这是不好的做法。

我的意思是拥有以下功能的例子:

public List<SomeCustomeType> GetListOfStuff()
{
}

public void DoSomeStuff(List<SomeCustomeType> param)
{

}

任何人都可以告诉我为什么这是不好的做法或不应该使用? 谢谢!

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

在LINQ及其相关扩展方法的时代,即使底层集合实现IEnumerable<T>,最好还是返回IList<T>。当底层集合为Count()时,LINQ扩展方法ElementAt()IList<T>都会进行优化,因此性能影响通常可以忽略不计。

这种做法将客户端代码与管理集合的细节隔离开来(将来你可能会想要使用不同类型的集合吗?)遵循这种模式时要考虑的主要问题是如果您正在进行某种形式的有状态惰性评估,则可以保证客户端自行缓存结果(例如,使用ToArray()。)

答案 2 :(得分:0)

不,这不错。但是,使用通用接口IList<T>可能比通用类List<T>更好。

答案 3 :(得分:0)

到目前为止,第一个更好。很明显,该方法创建新列表并返回它, 目前还不清楚谁负责创建第二个版本列表,如果它不是空的话会发生什么......