预期属性的表现与字段类似,即使它们确实是函数。关于任意IEnumerable
的预期表现可以说什么?
从属性中借用概念并说IEnumerable
应该与迭代数组或List<T>
执行相同的操作是否公平?
或者,对于每次迭代发生的任何事情都可以:数据库访问,Web服务调用,耗时的计算等。
答案 0 :(得分:1)
根据经验,你无法真正推断出任意IEnumerable
的表现。例如,伪装可能是IQueryable
,每次枚举时都会访问数据库。或者它可能是File.EnumerateLines
的结果。
有时重要的是枚举只能枚举一次。
这与属性形成鲜明对比。如果属性是命中数据库或读取I文件我会认为这是代码气味。对于IEnumerable
,这是正常的。
答案 1 :(得分:1)
我说没有关于IEnumerable<T>
应该执行得多好的规则 - 只关于它应该如何表现,这意味着它应该遍历你的集合。
如果您需要在迭代开始时访问数据库(如实体框架的IQueryable<T>
),那很好 - 如果需要对每个项目进行数据库或文件调用,那很好。对我来说唯一重要的是你可以循环使用它。
答案 2 :(得分:0)
IEnumerable没有属性,但IEnumerable会返回一个IEnumerator,如你所知。
如果你的对象公开了一个IEnumerable类型的属性,那么它应该在恒定时间内返回,但该枚举器的枚举应该没有期望。
当然,您的情况可能会有所不同。例如,如果您将某个WPF控件绑定到该枚举,则您的用户将希望它快速返回。
答案 3 :(得分:0)
当然IEnumerable
可以用来访问数据库或抓取文件,但是如果你公开这样的IEnumerable
,你应该清楚地记录它。
如果不能立即清楚它是昂贵的,你应该适当地封装它,并且只暴露一个内存中的枚举。