javaScript中一個(gè)重要的概念就是閉包,閉包在Javascript中有大量的應(yīng)用,但是你知道么?C#也可以創(chuàng)建Closure。下面就介紹一下如何在C#中創(chuàng)建神奇的閉包。
在這之前,我們必須先知道如何在C#中定義函數(shù)
1 //函數(shù)定義,參數(shù)為string,返回為string2 Func<string, string> myFunc = delegate(string msg)3 {4 return "Msg:" + msg;5 };
利用Lambda表達(dá)式也可以簡(jiǎn)化上述的代碼,但是效果一樣:
1 //Lambda2 Func<string, string> myFuncSame = msg => "Msg:" + msg;
定義好函數(shù)后,可以進(jìn)行調(diào)用:
1 //函數(shù)調(diào)用2 string message= myFuncSame("Hello world");
定義一個(gè)帶外部變量(相對(duì)于內(nèi)嵌函數(shù)而言)的嵌套函數(shù),外部函數(shù)將內(nèi)部嵌套的函數(shù)進(jìn)行返回:
1 public static Func<int, int> Func() 2 { 3 var myVar = 1; 4 Func<int, int> inc = delegate(int var1) 5 { 6 //myVar能夠記錄上一次調(diào)用后的狀態(tài)(值) 7 myVar = myVar + 1; 8 return var1 + myVar; 9 };10 return inc;11 }
C# Closure調(diào)用如下所示:
1 static void CsharpClosures()2 {3 var inc = Func();4 Console.WriteLine(inc(5));//75 Console.WriteLine(inc(6));//96 }
當(dāng)?shù)诙握{(diào)用inc(6)時(shí),此時(shí)函數(shù)內(nèi)變量myVar并未像第一次調(diào)用函數(shù)時(shí)進(jìn)行重新初始化(var myVar=1),而是保留了第一次運(yùn)算的值,即 2,因此inc(6)返回的結(jié)果為(2+1+6)=9.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注