的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