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