色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

C#與閉包

  首先想說(shuō)明一點(diǎn),雖然有這樣那樣的不好的心態(tài)(比如中文技術(shù)書(shū)),但總體來(lái)說(shuō),國(guó)內(nèi)的技術(shù)人員還是喜歡分享和教導(dǎo)別人的,這點(diǎn)我的個(gè)人感受和之前在園子里看到的朋友的感受恰恰相反。個(gè)人認(rèn)為其實(shí)國(guó)內(nèi)很多技術(shù)網(wǎng)友都是很熱心的,可能因?yàn)檎Z(yǔ)言問(wèn)題同一個(gè)技術(shù)熱點(diǎn)會(huì)稍稍落后國(guó)外一些,但一些成熟的或者基礎(chǔ)的概念都可以找到很細(xì)致的中文介紹,特別是關(guān)于閉包。因?yàn)樗淖置娼忉尨_實(shí)很繞,所以基本所有試圖解釋這一名詞的同學(xué)都是盡量用自己認(rèn)為最通俗易懂的方式來(lái)進(jìn)行講解。閑話扯遠(yuǎn)了,這里我就用C#語(yǔ)言來(lái)給大家解釋下閉包吧。

  其實(shí)要提到閉包,我們還得先提下變量作用域和變量的生命周期。

  在C#里面,變量作用域有三種,一種是屬于類的,我們常稱之為field;第二種則屬于函數(shù)的,我們通常稱之為局部變量;還有一種,其實(shí)也是屬于函數(shù)的,不過(guò)它的作用范圍更小,它只屬于函數(shù)局部的代碼片段,這種同樣稱之為局部變量。這三種變量的生命周期基本都可以用一句話來(lái)說(shuō)明,每個(gè)變量都屬于它所寄存的對(duì)象,即變量隨著其寄存對(duì)象生而生和消亡。對(duì)應(yīng)三種作用域我們可以這樣說(shuō),類里面的變量是隨著類的實(shí)例化而生,同時(shí)伴隨著類對(duì)象的資源回收而消亡(當(dāng)然這里不包括非實(shí)例化的static和const對(duì)象)。而函數(shù)(或代碼片段)的變量也隨著函數(shù)(或代碼片段)調(diào)用開(kāi)始而生,伴隨函數(shù)(或代碼片段)調(diào)用結(jié)束而自動(dòng)由GC釋放,它內(nèi)部變量生命周期滿足先進(jìn)后出的特性。

  那么這里有沒(méi)有例外呢?

  答案是有的,不過(guò)在提這點(diǎn)之前,我還需要給各位另外一個(gè)名詞。都說(shuō)C#就是MS版本的Java,這話在.NET 1.0可能可以這么說(shuō),但自2.0之后C#就可以自豪的說(shuō)它絕非Java了,這里面委托有很大的功勞。如果用過(guò)Java和C#的人并且嘗試過(guò)寫(xiě)WinForm程序時(shí)全部手寫(xiě)實(shí)現(xiàn)代碼的人就會(huì)有這樣一個(gè)感受,同樣的click事件,在Java中必須要無(wú)端的套個(gè)匿名類,但在c#中,你是可以直接將函數(shù)名+=到事件之后而不需要顯示寫(xiě)上匿名委托的對(duì)象類型的。因?yàn)榫幾g器會(huì)幫你做這部分工作,在3.0和以后的版本之中,微軟將委托的用法更是發(fā)揮的淋漓精致,無(wú)論是簡(jiǎn)潔的Lamda還是通俗易懂的LINQ,都是源自委托的。

  你可能要問(wèn),委托和我們今天要講的閉包又有什么關(guān)系呢?

  我們知道,C#, JavaJavaScript, Ruby, Python這些語(yǔ)言不同,在C#和Java的世界里面,原子對(duì)象就是類(當(dāng)然還有struct和基本變量),而不是很多動(dòng)態(tài)語(yǔ)言中的函數(shù),我們可以實(shí)例化一個(gè)類,實(shí)例化一個(gè)變量,但不可以直接new 一個(gè)函數(shù)。也就是表面上看,我們是沒(méi)辦法像js那樣將函數(shù)進(jìn)行實(shí)例化和傳遞的。這也是為什么直到Java 7閉包才被姍姍來(lái)遲的加入Java特性中。但對(duì)C#來(lái)說(shuō)這些只是表象,我剛學(xué)C#的時(shí)候,看到最多的解釋委托的話就是:委托啊,就相當(dāng)于C++里面的函數(shù)指針啦。這句話雖然籠統(tǒng),但確實(shí)有一定道理,通過(guò)委托特別是匿名委托這層對(duì)象的包裝,我們就可以突破無(wú)法將函數(shù)當(dāng)做對(duì)象傳遞的限制了。

  好像這里還是沒(méi)講到閉包和委托的關(guān)系,好吧,我太啰嗦了,下面從概念開(kāi)始講。

  閉包其實(shí)就是使用的變量已經(jīng)脫離其作用域,卻由于和作用域存在上下文關(guān)系,從而可以在當(dāng)前環(huán)境中繼續(xù)使用其上文環(huán)境中所定義的一種函數(shù)對(duì)象。

  好拗口,程序員,還是用示例來(lái)說(shuō)明更好理解。

  首先來(lái)個(gè)最簡(jiǎn)單的JavaScript中常常見(jiàn)到的關(guān)于閉包的例子:

function f1(){
  var n = 999;
  return function(){
    alert(n); // 999
return n;
  }
}
var a = f1();
alert(a());

NET技術(shù)C#與閉包,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 葫芦岛市| 新余市| 达孜县| 崇州市| 竹北市| 渭南市| 吉安县| 青川县| 东辽县| 农安县| 醴陵市| 枣庄市| 兰西县| 上杭县| 辉县市| 平罗县| 宁陕县| 三原县| 广汉市| 郯城县| 临夏市| 西昌市| 遂溪县| 客服| 太和县| 定襄县| 聂拉木县| 肃北| 靖远县| 宁强县| 都兰县| 沙坪坝区| 浮山县| 洛扎县| 阳信县| 锡林郭勒盟| 巴马| 梁平县| 洛宁县| 施秉县| 宁远县|