关于.NET战略,ilist,IEnumerable,iqueryable,ICollection,这是最灵活的返回类型?

List, IList, IEnumerable, IQueryable, ICollection, which is most flexible return type?

我以前在这里看到过这个问题,但我不满意我理解完整的后果。问题是,使用LINQ to SQL返回的数据层应该返回什么类型,以获得最大的灵活性和查询能力。这是我读到/找到的:

  • IEnumerable是有限的,只允许进行前读操作。IEnumerable是最通用的。我发现IEnumerable允许查询操作和扩展语法。

  • 由于插入操作,list允许最大的灵活性。

  • 应使用集合而不是列表来启用只读集合。

  • iqueryable不应该被使用,它应该被"使用并关闭"。iqueryable不返回列表,但为数据库生成查询语法。

  • 我觉得我对权衡有更好的感觉,但对一些事情仍不确定:

  • 为什么我要选择接口变体而不是具体类型?即iList或iCollection与List或Collection。我能得到什么好处?

  • 我看到扩展操作可以工作,但是扩展查询语法也可以工作吗?

  • 有人建议我以前使用asqueryable()。但是,如果我没有与数据库的连接,为什么要这样做?似乎扩展方法无论如何都有效。


  • 对于DAL返回,集合通常不是很有用,因为集合不能隐式地保证顺序。只是一桶东西。另一方面,一个伊利斯特人却暗中保证了秩序。因此,我们只能选择IEnumerable或IList。下一个问题是:列表对象是"活动"的吗?也就是说,它是否连接到数据备份,以便在向IList添加项时,它将反映在数据库中?对于Linq to SQL,情况并非如此。相反,您应该将实体附加到表中。所以,除非你提供额外的线路,否则列表是多余的。坚持IEnumerable。


    您应该始终返回一个接口,而不是具体的类型,这是不言而喻的,因为它指定了允许的行为,而不将使用者与特定的实现联系起来。

    对于要返回的接口,您应该考虑方法的目的和调用者的意图。如果返回集合,调用方是否能够更改集合?例如,添加/删除项目?如果他们只需要枚举它(执行foreach),那么您应该返回一个IEnumerable。


    1)最好返回一个IList,这样结果就可以放入实现该接口的任何对象中,而不是强制调用者使用列表。例如,调用方可能希望将结果返回到ArrayList,如果将结果返回到列表中,则不可能这样做。arraylist不从列表继承,但它实现了ilist。