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

什么是閉包,我的理解

  首先,我覺得,一個概念,如果不理解也不影響使用的話,那么,就沒必要去理解它、去學習它。閉包就是這樣一個概念,你不理解它也能很好的用它。俺這兩年寫as3程序,是天天在和它打交道,甚至有過一個function套一個,一個方法中套了20多個function的極端例子,但從未深究過它是怎么實現的,它就像水和空氣一樣,我們不需要知道水是H2O,空氣是氧氣氮氣二氧化碳等的混合物,也活的好好的。

  其次,我覺得,網上對閉包概念的解釋都太狹隘了,看得人蛋疼,就像回到了i++,++i時代一樣。如果非要去理解這個概念,像那樣去理解,則收獲太小,不值得。

  維基百科上對閉包的解釋就很經典:

在計算機科學中,閉包(Closure)是詞法閉包(Lexical Closure)的簡稱,是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。

Peter J. Landin 在1964年將術語閉包定義為一種包含環境成分和控制成分的實體。

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

  先看看數學上的閉包。

  (1,5) 是一個區間,但對這個區間做分析、計算什么的,經常會用到1和5這兩個不屬于這個區間的值,[1,5]就是(1,5)的閉包。

  在生活上,我們辦事情,找A部門,A部門說,你先得找B部門蓋個章,B部門說,你先得找C部門蓋個章,C部門說,這個東西不是我們的職權范圍…… 踢皮球,這就是非閉包。閉包就是負責到底,你找到A部門,A部門接待的那個人負責到底,他/她去協調B部門和C部門。

  在工程上,閉包就是項目經理,負責調度項目所需要的資源。老板、客戶有什么事情,直接找項目經理即可,不用再去找其它的人。

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

  這樣一來,可以把閉包從一個語法機制提升為一種設計原則

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

  在這個原則下,函數式語言中,那種所謂的閉包只是一種“閉包”,還有大量的其它類型的“閉包”等待發現和實現。

  下面舉出一些閉包設計原則的正例和反例。

  正例:

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

  反例:

  Winform 中的設計就違反了閉包原則,當不是在該UI線程中,更新某些控件的值時,會拋出異常。只能去invoke調用,而invoke的接口很難用,相信很多人對這東東極其反感。

  閉包不一定是語法糖。當我們不能直接擴展編譯器時,我們就無法增加語法糖來實現閉包機制,這時,就要用現有的語言機制來實現了。

  下面,我們來對winform的invoke方法進行改造,使它滿足閉包原則。下面是代碼:

    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技術什么是閉包,我的理解,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 91免费福利精品国产 | 国产日韩精品视频一区二区三区 | 国产一区二| 国产xxxxxx久色视频在 | 色播视频在线观看免费 | 成人免费观看视频高清视频 | 久久性妇女精品免费 | 午夜剧场刺激性爽免费视频 | 亚洲a毛片| 日本三区| 国产资源视频在线观看 | 91网站在线免费观看 | 国产精品网红女主播久久久 | nnnwww在线观看视频 | 视色4se在线视频播放 | 国产综合欧美日韩视频一区 | 91精品欧美一区二区三区 | 五月婷色 | 黄色免费观看 | 狠狠欧美 | 天天色天天操综合网 | www.五月婷| 亚洲精品视频在线免费 | 免费观看成人鲁鲁鲁鲁鲁视频 | 日本精品一区二区三区在线观看 | 国产精品福利在线观看入口 | 欧美亚洲另类色国产综合 | 中文字幕精品一区影音先锋 | 久久pao| 91精品久久久久久久久网影视 | 97在线播放视频 | 日本免费视屏 | 国产成人精品一区二区秒拍 | 黄页网址大全免费观看美女 | 碰碰碰人人澡人人爱摸 | 久久99国产精品免费观看 | freexxxx性大陆另类 | 欧美日韩亚洲精品国产色 | 中文字幕1区2区 | 日本高清一区二区三区水蜜桃 | 国产精品福利小视频 |