Closed. This question is opinion-based 。它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。

2年前关闭。



Improve this question




简短的问题 :可以将 数据对象 属性声明为 IEnumerable ,还是应该改为 Array

背景:

我刚刚在我们的项目中发现了一个导致性能问题的错误。原因是 IEnumerable 已被迭代多次。但这只是乍一看很简单。我认为那里存在设计缺陷,导致这种情况发生。

更深入的调查表明,一种方法 GetAllUsers 返回了一个 UsersResponse 对象,其属性之一是 IEnumerable<T> UsersList 。实现缓存时,显然整个 UsersResponse 对象都被缓存了,当时它工作正常,因为 GetAllUsersIEnumerable<T> UsersList 分配了一个数组。后来 GetAllUsers 的实现发生了变化,出于某种原因,开发人员认为 ToArray() 调用是多余的。所以我认为问题在于 UsersResponse 对象没有精心设计,并且为它的工厂方法提供了太多的自由。另一方面,缓存包含 IEnumerable 属性的对象原则上也是无用的。

所以我们回到我设计数据对象的一般问题:当你声明它时,不知道它是否会在 future 的某个时间被缓存,或者除了你当前的需要之外它会如何以其他方式使用,是否可以声明它的属性为 IEnumerable ,将谨慎使用的责任放在其他开发人员身上,还是从一开始就必须是 Array

我搜索的内容:

我发现的唯一建议是 Jon Wagner's blog post,他建议在构建 LINQ 链后立即“密封”它们。但这更多地与构建 IEnumerable 相关,而不是将其存储在实体属性中。虽然结合返回尽可能特定类型的原则,它可以暗示将属性声明为 Array

最佳答案

当我考虑 API 设计时,我总是试图对消费者“友好”。这意味着尽可能多地接受参数(如果可能),并尽可能多地提供返回值。如果您也认同这一点,则意味着您应该在提供 IEnumerable(或类似)返回值的同时争取 Array 参数。结果是 API 使用者的最大值(value)(即使最终是您自己)。

关于c# - 数据对象属性的最佳实践 : IEnumerable vs Array,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29535579/

10-16 19:44