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