[英]What is loop variable closure?
進行一個簡單的foreach
循環:
foreach(var i in Enumerable.Range(1,10))
{
Console.WriteLine(i);
}
在 C#5 之前 ,只有一個變量i
用於循環的整個運行(每次迭代)。
在引入C#5之后,此循環現在將具有10個獨立的i
變量...循環的每次迭代都有一個不同的變量。 這些變量的生存期較短,並且都具有相同的名稱,但是它們仍然是唯一變量。 1個
乍一看,差異似乎並不重要,但是當您使用閉包時,較舊的行為可能會產生意想不到的結果。
您可以通過以下代碼示例看到不同之處:
var results = new List<Func<int>>();
foreach(var i in Enumerable.Range(1,10))
{
results.Add(() => i);
}
foreach(var item in results)
{
Console.WriteLine(item());
}
該代碼將在VS 2010和VS 2012(及更高版本)中編譯並運行,但是根據您使用的代碼,將給出不同的結果。
一個closure
是當編譯器“關閉了”或“籠”變出來的是正常范圍區域,延長它的壽命會發生什么。 每當使用lambda表達式(由=>
運算符表示)時,通常也會涉及到閉包。 在我的示例中,變量i
在閉包中使用,可用於列表中的匿名函數。
重要的是要了解變量和值之間的區別。 如果您可以在VS2010中運行代碼,那么在只有一個變量的情況下,區別就很明顯了……循環的早期迭代中的變量值可以繼續被循環的后續迭代修改,然后再執行功能被調用,因此代碼將輸出所有10
s。 VS2012和更高版本的用戶將變量分開,因此將按順序輸出1
到10
。
1在有人問之前:沒有性能差異。 區別在於編譯器抽象細節可能會影響性能,但通常不會以任何可衡量的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.