中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C#中的閉包是什么-創(chuàng)新互聯(lián)

這篇文章主要講解了“C#中的閉包是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C#中的閉包是什么”吧!

成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供淇縣企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為淇縣眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

閉包的由來(lái)

形成閉包有一些值得總結(jié)的非必要條件:

1、嵌套定義的函數(shù)。

2、匿名函數(shù)。

3、將函數(shù)作為參數(shù)或者返回值。

4、在.NET中,可以通過(guò)匿名委托形成閉包:函數(shù)可以作為參數(shù)傳遞,也可以作為返回值返回,或者作為函數(shù)變量。而在.NET中,這都可以通過(guò)委托來(lái)實(shí)現(xiàn)。這些是實(shí)現(xiàn)閉包的前提。

要說(shuō)閉包的由來(lái)就不得不先說(shuō)下函數(shù)式編程了。近幾年函數(shù)式編程也是比較火熱,我們先來(lái)看看函數(shù)式編程的一些基本的特性這個(gè)有助于我們理解閉包的由來(lái)。

 函數(shù)式編程

函數(shù)式編程是一種編程模型,他將計(jì)算機(jī)運(yùn)算看做是數(shù)學(xué)中函數(shù)的計(jì)算,并且避免了狀態(tài)以及變量的概念。這里很明顯的指出了函數(shù)式編程中最重要的就是函數(shù)而且是數(shù)學(xué)中的函數(shù),比如f(x),數(shù)學(xué)中的函數(shù)大的特點(diǎn)就是只要是同樣的參數(shù)x那么我的結(jié)果必定是相等的,也就是說(shuō)我們函數(shù)的返回值只是依賴于參數(shù)而不依賴于其他狀態(tài)(比如js中的全局變量就是一個(gè)干擾因素);后一句中說(shuō)避免變量的概念,這句話如果從函數(shù)式編程來(lái)說(shuō)不太恰當(dāng),因?yàn)檫@句話中的函數(shù)意思還是我們?cè)诰幊陶Z(yǔ)言中所使用的變量也就是一個(gè)存儲(chǔ)單元,而在函數(shù)式編程中變量卻是數(shù)學(xué)中變量的定義是一個(gè)值得名稱(chēng)。比如,我們最基本的賦值等式 x = x+1,讓我們程序員看這是一個(gè)簡(jiǎn)單的賦值代碼,而讓學(xué)數(shù)學(xué)的人來(lái)說(shuō)這個(gè)等式是根本不成立的。 所以我們?cè)诤瘮?shù)式編程中是不允許多次賦值的。而這一句話也是講述了函數(shù)式編程好處的最主要的原因:

第一點(diǎn)、函數(shù)的結(jié)果只依賴于參數(shù)而不依賴其他狀態(tài),這樣寫(xiě)的代碼很容易進(jìn)行推理不容易發(fā)生錯(cuò)誤,極大的方便的單元測(cè)試和調(diào)試。

第二點(diǎn)、因?yàn)椴豢勺冃院蜔o(wú)狀態(tài),那么我們?cè)谔幚矶鄠€(gè)線程之間就不用擔(dān)心資源的爭(zhēng)奪,不需要用鎖來(lái)保存狀態(tài)。

高階函數(shù)

函數(shù)式編程中函數(shù)是一等公民,和我們的口號(hào) "萬(wàn)物皆對(duì)象"有點(diǎn)相似,在函數(shù)式編程中,我們努力用函數(shù)來(lái)表達(dá)所有的事情,當(dāng)然我們也需要函數(shù)可以傳過(guò)來(lái)傳過(guò)去這就是高階函數(shù),也就是把函數(shù)作為參數(shù)或者返回值,繼而實(shí)現(xiàn)復(fù)用,這樣即是可以把復(fù)用的粒度降到函數(shù)。C#語(yǔ)言中也有類(lèi)似的東西--委托,當(dāng)然C#中的函數(shù)跟函數(shù)式編程中的就不一樣了,但是有吸收一些函數(shù)式編程語(yǔ)言中的特性,比如C#中l(wèi)amda,Linq。

關(guān)于函數(shù)式編程博客園有很多很好的文章介紹我就不詳說(shuō)了,接下來(lái)就是引出我們今天的主題--閉包。

因?yàn)楹瘮?shù)式編程的基礎(chǔ)就是Lambda演算,所以這一節(jié)演算我們用Lambda演算來(lái)帶出我們的主題,關(guān)于這個(gè)演算我也懂得不是太多,想要入門(mén)的同學(xué)可以看看這個(gè)  點(diǎn)這里

首先定義一個(gè)簡(jiǎn)單的演算

    λx.λy.x+y

如果x為1 y為2 演算過(guò)程則為

  ((λx.λy.x+y)1)2=(λy.1+y)2=(1+2)=3

接下來(lái)我們用到高階函數(shù)

   λy . (λx . x + y)

演算過(guò)程:

  ((λy . (λx . x + y))1)2=((λx . x + 1))2 = (2+1)=3

可以看到這個(gè)演算中外層函數(shù)使用的是內(nèi)層函數(shù),也就是說(shuō)使用是一個(gè)函數(shù)作為了計(jì)算結(jié)果。OK ,我們把內(nèi)層函數(shù)單獨(dú)拿出來(lái),(λx . x + y),可以很明顯的看到如果脫離的上下文呢,我們的y是沒(méi)有值的,也就是y是沒(méi)有綁定的,也可以說(shuō)y對(duì)于我們這個(gè)函數(shù)是自由的! 如果在函數(shù)式編程中,在外層函數(shù)執(zhí)行完畢之后我們的y變量就應(yīng)該被銷(xiāo)毀,那么如果我們?cè)趦?nèi)層函數(shù)中如果還需要用到y(tǒng)的話怎么辦呢? 對(duì)于這個(gè)問(wèn)題,設(shè)計(jì)者則做了其他的處理:如果一個(gè)函數(shù)返回另一個(gè)函數(shù),而被返回函數(shù)又需要外層函數(shù)的變量時(shí),不會(huì)立即釋放這個(gè)變量,而是允許被返回的函數(shù)引用這些變量。支持這種機(jī)制的語(yǔ)言稱(chēng)為支持閉包機(jī)制,而這個(gè)內(nèi)部函數(shù)連同其自由變量就形成了一個(gè)閉包(這句話是摘自其他博客,自己難得整理文字。。。)。這就是我們閉包的由來(lái),而我們其他的語(yǔ)言如果有用到函數(shù)式編程的思想,并且允許函數(shù)來(lái)進(jìn)行傳遞就會(huì)遇到類(lèi)似的問(wèn)題,所以各個(gè)語(yǔ)言就需要用其自己的方式來(lái)實(shí)現(xiàn)閉包!

C#中閉包的實(shí)現(xiàn)

從上一節(jié)我們也就是能總結(jié)出閉包其實(shí)就是要執(zhí)行并且包含自由變量的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對(duì)象沒(méi)有被釋放)和為自由變量提供綁定的計(jì)算環(huán)境的一個(gè)結(jié)合。

然后進(jìn)入我們的C#編程時(shí)刻了,我們就用簡(jiǎn)單的例子來(lái)實(shí)現(xiàn),并且查看編譯器生成的代碼 看看C#中是怎么實(shí)現(xiàn)閉包,畢竟我們也是有委托的 。。。

首先寫(xiě)一個(gè)簡(jiǎn)單得不能在簡(jiǎn)單的代碼   

using System;

namespace closure
{
 class Program
 {
 static void Main(string[] args)
 {
 Console.WriteLine(test(1)(2));
 Console.ReadKey();
 }

 public static Func<int,int> test(int x)
 {
 //作用域1
 return (y) => 
 {
 //作用域2
 return x + y;
 };
 }
 }
}

可以看到我們test的方法中傳入變量x的作用域是在1 在執(zhí)行匿名函數(shù)的時(shí)候應(yīng)該是已經(jīng)釋放在作用域2就不應(yīng)該存在了,而我們卻能準(zhǔn)確的得到計(jì)算結(jié)果   

C#中的閉包是什么

說(shuō)明我們的變量x確實(shí)在作用域2中還存在,接下來(lái)我們看看編譯器幫我們做了什么事情,

C#中的閉包是什么 

可以看到我們的test方法中多了一個(gè)對(duì)象 <>c__DisplayClass1_0  class_;這個(gè)東西的具體定義是啥?

C#中的閉包是什么 

這個(gè)很明顯了,其實(shí)閉包只是編譯器幫我們把自由變量封裝到了一個(gè)對(duì)象中供我們作用域外使用,那我們?nèi)绻サ糇饔糜?中使用x變量呢?

C#中的閉包是什么 

編譯器原來(lái)為了自由變量維護(hù)的對(duì)象沒(méi)了 。。。結(jié)果在意料之中。

感謝各位的閱讀,以上就是“C#中的閉包是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C#中的閉包是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站題目:C#中的閉包是什么-創(chuàng)新互聯(lián)
路徑分享:http://www.rwnh.cn/article36/cciisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司、微信公眾號(hào)外貿(mào)建站、虛擬主機(jī)關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)
淄博市| 莎车县| 富川| 花垣县| 云安县| 泸西县| 竹山县| 凤凰县| 株洲市| 四会市| 江达县| 兴山县| 聂荣县| 阳江市| 长子县| 综艺| 崇文区| 徐闻县| 年辖:市辖区| 宕昌县| 望江县| 左贡县| 西青区| 长海县| 阿克苏市| 金溪县| 奉贤区| 湘潭县| 马龙县| 江北区| 平安县| 威远县| 搜索| 泸州市| 枝江市| 宾阳县| 临海市| 哈尔滨市| 台前县| 大荔县| 油尖旺区|