Closed. This question is opinion-based 。它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。
2年前关闭。
Improve this question
简短的问题 :可以将 数据对象 属性声明为
背景:
我刚刚在我们的项目中发现了一个导致性能问题的错误。原因是 IEnumerable 已被迭代多次。但这只是乍一看很简单。我认为那里存在设计缺陷,导致这种情况发生。
更深入的调查表明,一种方法
所以我们回到我设计数据对象的一般问题:当你声明它时,不知道它是否会在 future 的某个时间被缓存,或者除了你当前的需要之外它会如何以其他方式使用,是否可以声明它的属性为
我搜索的内容:
我发现的唯一建议是 Jon Wagner's blog post,他建议在构建 LINQ 链后立即“密封”它们。但这更多地与构建 IEnumerable 相关,而不是将其存储在实体属性中。虽然结合返回尽可能特定类型的原则,它可以暗示将属性声明为
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。
2年前关闭。
Improve this question
简短的问题 :可以将 数据对象 属性声明为
IEnumerable
,还是应该改为 Array
?背景:
我刚刚在我们的项目中发现了一个导致性能问题的错误。原因是 IEnumerable 已被迭代多次。但这只是乍一看很简单。我认为那里存在设计缺陷,导致这种情况发生。
更深入的调查表明,一种方法
GetAllUsers
返回了一个 UsersResponse
对象,其属性之一是 IEnumerable<T> UsersList
。实现缓存时,显然整个 UsersResponse
对象都被缓存了,当时它工作正常,因为 GetAllUsers
为 IEnumerable<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