http://kb.cnblogs.com/page/111780/閉包
這個問題是在最近一次英格蘭Brighton ALT.NET Beers活動中提出來的。我發現,若是不用代碼來演示,你很難單用話語把它解釋清楚,因此,在這裏,我打算用C#來解釋一下什麼是閉包(closures)。維基百科上說:函數
在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即便已經離開了創造它的環境也不例外。因此,有另外一種說法認爲閉包是由函數和與其相關的引用環境組合而成的實體。.net
因此,一個閉包就是一個「捕獲」或「攜帶」了其被生成的環境中、所屬的變量範圍內所引用的全部變量的函數。的確,很難描述,但當你看完了這些代碼後,你就很容易理解了。code
var x = 1;
Action action = () =>
{
var y = 2;
var result = x+y;
Console.Out.WriteLine("result = {0}", result);
};
action();
這裏咱們首先定義了一個變量「x」,值爲1。而後咱們定義了一個匿名函數(一個lambda表達式)賦給類型Action。Action沒有參數,沒有返回值,但若是你觀察「action」裏的定義,你會發現它使用了「x」變量。這是變量是被action「捕獲」或「攜帶」的,自動被添加到了action的運行環境中了。blog
當咱們執行action時,它輸出了咱們預期的結果。請注意,當咱們執行時,原始的「x」此時已經脫離了它當初的變量環境,但它仍然能用。ip