簡體   English   中英

什么是循環變量關閉?

[英]What is loop variable closure?

我已經閱讀了這個問題 ,在C#5.0中引入了循環變量閉包 ,並且已經訪問了問題中的鏈接以了解它的含義。 令我感到羞恥的是,我無法理解什么是循環變量閉包,因為博客文章解釋了很多有關從節塊生成警告的內容,而以前從未生成過任何編譯警告,以及在新版本的編程語言上更改了代碼。 據我了解,循環閉包不是foreach的格式,而是數組中涉及的變量。 這是正確的嗎?

進行一個簡單的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和更高版本的用戶將變量分開,因此將按順序輸出110


1在有人問之前:沒有性能差異。 區別在於編譯器抽象細節可能會影響性能,但通常不會以任何可衡量的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM