一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

什么是閉包,我的理解

  首先,我覺(jué)得,一個(gè)概念,如果不理解也不影響使用的話,那么,就沒(méi)必要去理解它、去學(xué)習(xí)它。閉包就是這樣一個(gè)概念,你不理解它也能很好的用它。俺這兩年寫(xiě)as3程序,是天天在和它打交道,甚至有過(guò)一個(gè)function套一個(gè),一個(gè)方法中套了20多個(gè)function的極端例子,但從未深究過(guò)它是怎么實(shí)現(xiàn)的,它就像水和空氣一樣,我們不需要知道水是H2O,空氣是氧氣氮?dú)舛趸嫉鹊幕旌衔铮不畹暮煤玫摹?/span>

  其次,我覺(jué)得,網(wǎng)上對(duì)閉包概念的解釋都太狹隘了,看得人蛋疼,就像回到了i++,++i時(shí)代一樣。如果非要去理解這個(gè)概念,像那樣去理解,則收獲太小,不值得。

  維基百科上對(duì)閉包的解釋就很經(jīng)典:

在計(jì)算機(jī)科學(xué)中,閉包(Closure)是詞法閉包(Lexical Closure)的簡(jiǎn)稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,即使已經(jīng)離開(kāi)了創(chuàng)造它的環(huán)境也不例外。所以,有另一種說(shuō)法認(rèn)為閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。

Peter J. Landin 在1964年將術(shù)語(yǔ)閉包定義為一種包含環(huán)境成分和控制成分的實(shí)體。

  下面是我理解的閉包概念。

  先看看數(shù)學(xué)上的閉包。

  (1,5) 是一個(gè)區(qū)間,但對(duì)這個(gè)區(qū)間做分析、計(jì)算什么的,經(jīng)常會(huì)用到1和5這兩個(gè)不屬于這個(gè)區(qū)間的值,[1,5]就是(1,5)的閉包。

  在生活上,我們辦事情,找A部門(mén),A部門(mén)說(shuō),你先得找B部門(mén)蓋個(gè)章,B部門(mén)說(shuō),你先得找C部門(mén)蓋個(gè)章,C部門(mén)說(shuō),這個(gè)東西不是我們的職權(quán)范圍…… 踢皮球,這就是非閉包。閉包就是負(fù)責(zé)到底,你找到A部門(mén),A部門(mén)接待的那個(gè)人負(fù)責(zé)到底,他/她去協(xié)調(diào)B部門(mén)和C部門(mén)。

  在工程上,閉包就是項(xiàng)目經(jīng)理,負(fù)責(zé)調(diào)度項(xiàng)目所需要的資源。老板、客戶有什么事情,直接找項(xiàng)目經(jīng)理即可,不用再去找其它的人。

  在程序語(yǔ)言中,閉包就是一種語(yǔ)法糖,它以很自然的形式,把我們的目的和我們的目的所涉及的資源全給自動(dòng)打包在一起,以某種自然、盡量不讓人誤解的方式讓人來(lái)使用。至于其具體實(shí)現(xiàn),我個(gè)人意見(jiàn),在不影響使用的情況下,不求甚解即可。在很多情況下,需要在一段代碼里去訪問(wèn)外部的局部變量,不提供這種語(yǔ)法糖,需要寫(xiě)非常多的代碼,有了閉包這個(gè)語(yǔ)法糖,就不用寫(xiě)這么多代碼,自然而然的就用了。

  這樣一來(lái),可以把閉包從一個(gè)語(yǔ)法機(jī)制提升為一種設(shè)計(jì)原則

閉包是從用戶角度考慮的一種設(shè)計(jì)概念,它基于對(duì)上下文的分析,把齷齪的事情、復(fù)雜的事情和外部環(huán)境交互的事情都自己做了,留給用戶一個(gè)很自然的接口。

  在這個(gè)原則下,函數(shù)式語(yǔ)言中,那種所謂的閉包只是一種“閉包”,還有大量的其它類型的“閉包”等待發(fā)現(xiàn)和實(shí)現(xiàn)。

  下面舉出一些閉包設(shè)計(jì)原則的正例和反例。

  正例:

  Flex中的數(shù)據(jù)綁定語(yǔ)法就是一種“閉包”。x="{b.num + c.num}",對(duì)于這個(gè)語(yǔ)法,編譯器自動(dòng)去上下文中尋找叫 b 和 c 的變量,然后再找他們內(nèi)部 num 變量,如果他們都是可綁定的話,則自動(dòng)給它們添加上綁定鏈,當(dāng) b, c, num 等有任一變動(dòng)時(shí),更新 x 的值。

  反例:

  Winform 中的設(shè)計(jì)就違反了閉包原則,當(dāng)不是在該UI線程中,更新某些控件的值時(shí),會(huì)拋出異常。只能去invoke調(diào)用,而invoke的接口很難用,相信很多人對(duì)這東東極其反感。

  閉包不一定是語(yǔ)法糖。當(dāng)我們不能直接擴(kuò)展編譯器時(shí),我們就無(wú)法增加語(yǔ)法糖來(lái)實(shí)現(xiàn)閉包機(jī)制,這時(shí),就要用現(xiàn)有的語(yǔ)言機(jī)制來(lái)實(shí)現(xiàn)了。

  下面,我們來(lái)對(duì)winform的invoke方法進(jìn)行改造,使它滿足閉包原則。下面是代碼:

    public class ControlFuncContext 
{
public Control Control { get; private set; }
public Delegate Delegate { get; private set; }
public ControlFuncContext(Control ctl, Delegate d)
{
this.Control = ctl;
this.Delegate = d;
}
public void Invoke0()
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke();
}
catch(ObjectDisposedException ex)
{
}
}
}
public void Invoke1<T>(T obj)
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke(obj);
}
catch (ObjectDisposedException ex)
{
}
}
}
public void Invoke2<T0,T1>(T0 obj0, T1 obj1)
{
if (Control.IsHandleCreated == true)
{
try
{
Delegate.DynamicInvoke(obj0, obj1);
}
catch (ObjectDisposedException ex)
{
}
}
}
}
public static class FormClassHelper
{
public static void InvokeAction(this Control ctl, Action action)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action(fc.Invoke0));
}
}
public static void InvokeAction<T>(this Control ctl, Action<T> action, T obj)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action<T>(fc.Invoke1<T>), obj);
}
}
public static void InvokeAction<T0, T1>(this Control ctl, Action<T0, T1> action, T0 obj0, T1 obj1)
{
if (ctl.IsHandleCreated == true)
{
ControlFuncContext fc = new ControlFuncContext(ctl, action);
ctl.Invoke(new Action<T0, T1>(fc.Invoke2<T0, T1>), obj0, obj1);
}
}
}

NET技術(shù)什么是閉包,我的理解,轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 91视频免费网址 | 四虎影免看黄 | 午夜精品福利视频 | 久久伊人成人网 | 美女免费精品高清毛片在线视 | 国产精品热久久毛片 | 色呦呦免费视频 | 香蕉成人啪国产精品视频综合网 | 狠狠五月深爱婷婷网 | 91国内在线国内在线播放 | 欧美日韩亚洲国产精品一区二区 | 中文字幕在线一区二区在线 | 高清视频 一区二区三区四区 | 五月激情婷婷网 | 肉色丝袜一区二区高跟鞋 | 综合色视频 | 天天干b| 欧美一区二区三区精品国产 | 国产婷婷色 | 香港三级欧美国产精品 | 三级午夜宅宅伦不卡在线 | 羞羞色男人的天堂伊人久久 | 欧美激情视频在线免费观看 | 久久久噜噜噜久久久 | 狠狠五月深爱婷婷网 | 亚色国产 | 久久国产影视免费精品 | 色偷偷亚洲女人天堂观看欧 | 五月婷婷激情综合网 | 国产欧美一区二区三区在线看 | 美女扒开双腿让男人爽透视频 | 国产永久在线 | 91精品视频观看 | 免费看美女毛片 | 国产丝袜美腿高跟白浆 | 黄视频大全 | 国产精品视频一区二区猎奇 | 久久综合一区二区三区 | 免费国产一区二区在免费观看 | 午夜免费观看_视频在线观看 | 综合区小说区图片区在线一区 |