C# 中閉包(Closure)詳解
C# 中閉包(Closure)詳解
這個(gè)問題是在最近一次英格蘭 Brighton ALT.NET Beers 活動(dòng)中提出來的。我發(fā)現(xiàn),如果不用代碼來演示,你很難單用話語把它解釋清楚,所以,在這里,我打算用 C# 來解釋一下什么是閉包(closures)。維基百科上說:
在計(jì)算機(jī)科學(xué)中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。
所以,一個(gè)閉包就是一個(gè)“捕獲”或“攜帶”了其被生成的環(huán)境中、所屬的變量范圍內(nèi)所引用的所有變量的函數(shù)。的確,很難描述,但當(dāng)你看完了這些代碼后,你就很容易理解了。
var x = 1;
Action action = () =>
{
var y = 2;
var result = x + y;
Console.Out.WriteLine("result = {0}", result);
};
action();
這里我們首先定義了一個(gè)變量“x”,值為1。然后我們定義了一個(gè)匿名函數(shù)(一個(gè) lambda 表達(dá)式)賦給類型 Action。Action 沒有參數(shù), 沒有返回值,但如果你觀察“action”里的定義,你會(huì)發(fā)現(xiàn)它使用了“x”變量。這是變量是被 action“捕獲”或“攜帶”的,自動(dòng)被添加到了 action 的運(yùn)行環(huán)境中了。
當(dāng)我們執(zhí)行 action 時(shí),它輸出了我們預(yù)期的結(jié)果。請注意,當(dāng)我們執(zhí)行時(shí),原始的“x”此時(shí)已經(jīng)脫離了它當(dāng)初的變量環(huán)境,但它仍然能用。
當(dāng)你在代碼調(diào)試器(debugger)里觀察“action”時(shí),會(huì)發(fā)現(xiàn)很有趣的事情。我們可以看到,C# 編譯器為我們創(chuàng)建了一個(gè) Target 類,里面封裝了 x 變量:

閉包(Closure)
閉包(和 higher order functions)都是非常有用的東西。如果你曾經(jīng)開發(fā)過稍微復(fù)雜一點(diǎn)的 JavaScript 程序,你可能就會(huì)知道,這個(gè)東西可以被當(dāng)成很多面向?qū)ο筇卣鞯奶娲?,就?C# 那樣。前不久我還在 C# 里寫了一個(gè)例子來驗(yàn)證這種想法。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
C#使用iTextSharp將PDF轉(zhuǎn)成文本的方法
這篇文章主要介紹了C#使用iTextSharp將PDF轉(zhuǎn)成文本的方法,涉及C#操作pdf文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05
C#中DateTime.Compare()比較時(shí)間大小
本文主要介紹了C#中DateTime.Compare()比較時(shí)間大小,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
C# 中const,readonly,static的使用小結(jié)
這篇文章主要介紹了C# 中使用const,readonly,static的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01
C#中JSON轉(zhuǎn)為實(shí)體類和List以及結(jié)合使用
開發(fā)中經(jīng)常遇到將JSON字符串轉(zhuǎn)換為List的需求,下面這篇文章主要給大家介紹了關(guān)于C#中JSON轉(zhuǎn)為實(shí)體類和List以及結(jié)合使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
C#在winform中實(shí)現(xiàn)數(shù)據(jù)增刪改查等功能
本篇文章主要是介紹了C#在winform中操作數(shù)據(jù)庫,實(shí)現(xiàn)數(shù)據(jù)增刪改查,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
C#常用數(shù)據(jù)結(jié)構(gòu)棧的詳細(xì)介紹
在C#中,Stack<T> 是一個(gè)后進(jìn)先出(LIFO,Last-In-First-Out)集合類,位于System.Collections.Generic 命名空間中,本文詳細(xì)介紹C#常用數(shù)據(jù)結(jié)構(gòu)棧,感興趣的朋友跟隨小編一起看看吧2024-09-09
C#值類型、引用類型中的Equals和==的區(qū)別淺析
這篇文章主要介紹了C#值類型、引用類型中的Equals和==的區(qū)別淺析,本文分別對C#值類型和引用類型中的Equals和==做了講解和給出了實(shí)例,需要的朋友可以參考下2015-01-01

