可能是一個愚蠢的問題,但我有很多:如果更換(X)的foreach()與Foreach.Where(X)
if(X)
{
foreach(var Y in myList.Where(z => z == 1)
{
}
}
結構中的某些代碼
與
foreach(var Y in myList.Where(z => X && z == 1) { }
瘋了嗎?
它可能不太可讀,但編譯器是否會優化它以使它幾乎相同的代碼?
可能是一個愚蠢的問題,但我有很多:如果更換(X)的foreach()與Foreach.Where(X)
if(X)
{
foreach(var Y in myList.Where(z => z == 1)
{
}
}
結構中的某些代碼
與
foreach(var Y in myList.Where(z => X && z == 1) { }
瘋了嗎?
它可能不太可讀,但編譯器是否會優化它以使它幾乎相同的代碼?
不,您的第一個版本更好,更快。當X
爲真時,第二個版本將針對序列中的每個元素評估X
。
你應該堅持第一個版本。
當x爲false時,第二個選項會慢很多,因爲當您知道檢查總是失敗時,您正在使用linq檢查列表中的所有項目。
編譯器優化器將無法撤消您的損害。這種優化級別通常只能用於函數式語言,因爲編譯器很難跟蹤可能的副作用。
Linq沒有內置任何優化內容,這些優化內容與您期望從數據庫中的SQL查詢重寫器期望的內容相近。
它們不會編譯成相同的代碼。在第二個版本中,X
被多次評估,並且myList
被枚舉。最糟糕的情況是評估X
更改的東西,並且你有不可預知的功能。
避免?爲什麼要避免這種情況? – Yagzii 2015-03-11 16:29:42