只有在需要进行延迟评估时,才应该从方法和属性中返回 IEnumerable<T>
。
当您返回 IEnumerable
、ICollection
和 IList
时,您是否有任何模式可以遵循?
只有在需要进行延迟评估时,才应该从方法和属性中返回 IEnumerable<T>
。
当您返回 IEnumerable
、ICollection
和 IList
时,您是否有任何模式可以遵循?
如果结果只是为了您方法的调用者进行读取,那么您可以返回IEnumerable<T>
。
IEnumerable<T>
:
结果是一个数组、列表或任何类型的集合,因为消费者只需要迭代它,所以结果并不重要。
结果使用 IEnumerable<T>
的实现进行了类型化,但公共 API 不强制消费者使用特定于 API 的类型,因此消费者使用 POCO 保持中立。
如果预计结果是一个集合,则应返回 IEnumerable<T>
的特定实现,例如 ICollection<T>
、IList<T>
、List<T>
等。这样消费者就能够使用索引器访问可枚举成员,或者修改集合本身(添加、更新、删除、搜索... 集合中的项)。
选择正确的具体类型作为属性和返回类型更多地是关于良好的案例分析,并只输入消费者需要的内容。
例如,从概念上讲,某个属性应该返回一个 list,但是消费者不应该对其进行修改,因此,该属性应该返回一个 ReadOnlyCollection<T>
,但你应该将其键入为 IList<T>
。
正如我上面所说的,进行良好的案例分析和 保持简单。
通常的经验法则是:
如果我确定总是知道返回结果的数量,我会返回 ICollection
。如果调用者只是枚举,他们可以轻松地将其视为 IEnumerable
。如果元素的顺序不是随机的,我使用 IList
。在其他情况下,我使用 IEnumerable
。对于一个接口的不同实现,我使用“最宽松”的接口,而不是重新复制结果以满足特定的集合接口。