JavaScript中一個重要的概念就是閉包,閉包在JavaScript中有大量的應用,但是你知道麼?C#也可以創建Closure。下面就介紹一下如何在C#中創建神奇的閉包。
在這之前,我們必須先知道如何在C#中定義函數
1 //函數定義,參數為string,返回為string 2 Func<string, string> myFunc = delegate(string msg) 3 { 4 return "Msg:" + msg; 5 };
利用Lambda表達式也可以簡化上述的代碼,但是效果一樣:
1 //Lambda 2 Func<string, string> myFuncSame = msg => "Msg:" + msg;
定義好函數後,可以進行調用:
1 //函數調用 2 string message= myFuncSame("Hello world");
定義一個帶外部變量(相對於內嵌函數而言)的嵌套函數,外部函數將內部嵌套的函數進行返回:
1 public static Func<int, int> Func() 2 { 3 var myVar = 1; 4 Func<int, int> inc = delegate(int var1) 5 { 6 //myVar能夠記錄上一次調用後的狀態(值) 7 myVar = myVar + 1; 8 return var1 + myVar; 9 }; 10 return inc; 11 }
C# Closure調用如下所示:
1 static void CsharpClosures() 2 { 3 var inc = Func(); 4 Console.WriteLine(inc(5));//7 5 Console.WriteLine(inc(6));//9 6 }
當第二次調用inc(6)時,此時函數內變量myVar並未像第一次調用函數時進行重新初始化(var myVar=1),而是保留了第一次運算的值,即 2,因此inc(6)返回的結果為(2+1+6)=9.