返回收藏品的最佳类型是哪种?
我应该用吗? IList<T>
, IEnumerable<T>
, IQueryable<T>
还有什么?哪个是最好的 为什么?
我正在尝试决定我应该使用哪种方式,无论是在接口还是我正在编写的几个类的实现中。
编辑 让我更进一步说明这一点,我使用LINQ to SQL通过WCF服务返回数据。感觉这可能会改变最佳使用类型?
返回收藏品的最佳类型是哪种?
我应该用吗? IList<T>
, IEnumerable<T>
, IQueryable<T>
还有什么?哪个是最好的 为什么?
我正在尝试决定我应该使用哪种方式,无论是在接口还是我正在编写的几个类的实现中。
编辑 让我更进一步说明这一点,我使用LINQ to SQL通过WCF服务返回数据。感觉这可能会改变最佳使用类型?
我默认为IEnumerable。我正在拍摄最小的界面曝光。都 IList<T>
和 IQueryable<T>
实行 IEnumerable<T>
。因此,除非您对方法有其他特定要求,否则我会选择极简主义并使用最少派生类型。如果您的调用代码中有其他要求,例如索引查找的性能或获取集合中的项目数,那么您可能希望选择其他类型,例如 ICollection<T>
。
该 框架设计指南 州:
使用
Collection<T>
或者是。的子类Collection<T>
属性或返回 表示读/写的值 集合。public Collection<Session> Sessions { get; }
使用
ReadOnlyCollection<T>
,一个子类 的ReadOnlyCollection<T>
或者很少见 例IEnumerable<T>
对于属性或 返回表示只读的值 集合。public ReadOnlyCollection<Session> Sessions { get; }
一般来说,更喜欢
ReadOnlyCollection<T>
。
关于LINQ,为.NET 3.5创建的指南是明确的,但不是(imo)完全令人信服的理由:
审查机构明确表示 LINQ的决定 不应该改变这个指导方针 [“不要回来
IEnumerator<T>
, 除了作为a的返回类型GetEnumerator
方法“]。你的 来电者最终会笨手笨脚 对象模型,如果他们选择不使用 LINQ或没有的语言 支持它。
使用所有可能的返回类型将符合的最不一般的类型。即,如果您正在查看的方法可能会返回 List<int>
或者 int[]
,然后我输入为 IEnumerable<int>
......如果它可以返回 List<int>
或者a List<Employee>
或者 int[]
我输入为 IEnumerable
。如果它总是返回a Collection<Employee>
或者a Collection<SalariedEmployee>
然后回来 Collection<Employee>
如果该方法将始终生成相同的类型,请使用该类型...
在消耗方法或接口中,otoh,返回的对象所在的位置 用过的,你应该使用相反的哲学,输入传入的方法参数作为 至少一般 消费方法中代码的内部功能所需的类型...即,如果使用集合对象的所有方法都通过它进行枚举 foreach
,那么传入的参数类型应该 IEnumerable<>
如果集合是无序的或不需要随机访问,则IEnumerable是正确的。如果它是一个列表并且您希望将其公开为一个列表,则声明方法或属性以返回IList,但您可能需要在该集合上返回一个ReadOnlyCollection包装器(直接或使用诸如List.AsReadOnly()之类的语法) 。只有当我有一些有用的覆盖时,我才会返回IQueryable。
写作时 应用,我没有看到返回特定泛型类型的任何问题,例如:
List<myType> MyMethod()
{
...
}
根据我的经验,对于原始开发人员来说这很容易,并且其他开发人员也很容易理解原始开发人员的意图。
但是,如果您正在开发某种将被其他开发人员使用的框架,您可能希望更复杂 - 例如,返回一个接口。
它最终取决于您要对返回的数据执行的操作。请记住,IEnumerable意味着(通过我的意思是强制)您以顺序方式访问数据。您无法添加,更改它,也无法访问阵列中特定点的项目。
IList没有此问题,但您必须提供其他功能来实现它。如果从.net对象继承,您可能不必担心它,但它实际上取决于您创建对象的方式。
每个都有他们的权衡,没有人总是默认。