的IEnumerable
然而,延迟执行可导致尤其是在多线程方案如错误。在锁之外的共享集合上执行评估。当一个返回延迟评估的方法嵌套多个方法层时,它可能会非常难以记住或保持跟踪,以便适当锁定。
忽略像无限序列(如Fibonacci)这样的特殊情况,并且假设集合的过滤被认为是完全的(即消费者不太可能会进一步过滤结果),那么会被认为是“最好的方法“从一个方法返回一个IEnumerable集合时 - 是否应该评估或推迟?
注意:“最佳方法”可以根据其他度量的效率/代码安全性来定义,只需在您的响应中进行验证即可。我想知道社区如何做到这一点。
后续问题:在方法名称中明确声明结果是否被评估或推迟是否有意义?
在其他项目中编写用于最大程度重用的类时,如果消费者正在多线程场景中运行,则不会先验地知道该类。多线程环境中的非线程安全类很糟糕。所以你的观点1.似乎表明所有的方法都应该进行急切的评估? – JohnC 2013-03-20 16:34:03
@JohnC我会争辩说,一个可枚举的_knows_的使用者,默认情况下它是_not_线程安全的。在大多数情况下,这不是问题。如果这是一个问题,确保它是线程安全的是消费者的责任。例如通过调用它上面的“ToArray”。如果底层集合已经是一个数组,则什么都不会发生。否则,在这一点上进行评估。 – Virtlink 2013-03-20 16:36:41
参考你的bigquery的例子。First()比bigquery.ToArray()。First()更快,请注意,我在我的问题中声明“假设集合的过滤被认为是完整的(即消费者不太可能会进一步过滤结果) ”。在你的例子中,数组被进一步过滤了第一个元素;不完全是我所要求的场景。 – JohnC 2013-03-20 16:36:47