最佳类型设置为返回集合的方法的返回类型?

返回collections品的最佳类型是哪种?

我应该使用IListIEnumerableIQueryable ,还有什么? 哪个最好, 为什么

我正在尝试决定我应该使用哪种方式,无论是在接口还是我正在编写的几个类的实现中。

编辑让我更进一步,我使用LINQ to SQL通过WCF服务返回数据。 感觉这可能会改变最佳使用类型?

我默认为IEnumerable。 我正在拍摄最小的界面曝光。 IListIQueryable实现IEnumerable 。 因此,除非您对方法有其他特定要求,否则我会选择极简主义并使用最少派生类型。 如果您的调用代码中有其他要求,例如索引查找的性能或获取集合中的项目数,那么您可能希望选择其他类型,例如ICollection

框架设计指南声明:

使用CollectionCollection的子类获取属性或返回表示读/写集合的值。

 public Collection Sessions { get; } 

使用ReadOnlyCollectionReadOnlyCollection的子类,或者在极少数情况下使用IEnumerable表示属性或返回表示只读集合的​​值。

 public ReadOnlyCollection Sessions { get; } 

通常,更喜欢ReadOnlyCollection

关于LINQ,为.NET 3.5创建的指南是明确的,但不是(imo)完全令人信服的理由:

审查机构明确决定LINQ不应改变本指南[“不要返回IEnumerator ,除了作为GetEnumerator方法的返回类型”]。 如果调用者选择不使用LINQ或不支持LINQ的语言,则他们最终会得到一个笨拙的对象模型。

使用所有可能的返回类型将符合的最不一般的类型。 即,如果您正在查看的方法可能返回Listint[] ,那么我将键入IEnumerable …如果它可以返回ListList或一个int[]我输入IEnumerable 。 如果它总是返回CollectionCollection则返回Collection

如果该方法将始终生成相同的类型,请使用该类型…

在使用返回对象的消费方法或接口otoh中,您应该使用相反的原则,将传入方法参数键入消费方法中代码的内部function所需的最不通用类型。即,如果使用foreach通过它枚举集合对象的所有方法,那么传入的参数类型应该是IEnumerable<>

如果集合是无序的或不需要随机访问,则IEnumerable是正确的。 如果它是一个列表并且您希望将其公开为一个列表,则声明方法或属性以返回IList,但您可能需要在该集合上返回一个ReadOnlyCollection包装器(直接或使用诸如List.AsReadOnly()之类的语法) 。 只有当我有一些有用的覆盖时,我才会返回IQueryable。

在编写应用程序时 ,我没有看到返回特定generics类型的任何问题,例如:

 List MyMethod() { ... } 

根据我的经验,对于原始开发人员来说这很容易,并且其他开发人员也很容易理解原始开发人员的意图。

但是,如果您正在开发某种将被其他开发人员使用的框架,您可能希望更复杂 – 例如,返回一个接口。

它最终取决于您要对返回的数据执行的操作。 请记住,IEnumerable意味着(通过我的意思是强制)您以顺序方式访问数据。 您无法添加,更改它,也无法访问arrays中特定点的项目。

IList没有此问题,但您必须提供其他function来实现它。 如果从.net对象inheritance,您可能不必担心它,但它实际上取决于您创建对象的方式。

每个都有他们的权衡,没有人总是默认。