加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 数据对象属性的最佳实践:IEnumerable vs Array

发布时间:2020-12-15 22:12:39 所属栏目:百科 来源:网络整理
导读:简短的问题:将数据对象属性声明为IEnumerable是否可以,或者它应该是Array? 背景: 我刚刚在项目中发现了一个导致性能问题的错误.原因是IEnumerable已被多次迭代.但这只是初看起来很简单.我认为那里存在一个设计缺陷,允许这种情况发生. 更深入的研究表明,一
简短的问题:将数据对象属性声明为IEnumerable是否可以,或者它应该是Array?

背景:

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

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

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

我搜索过的内容:

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读