亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#函數式程序設計之用閉包封裝數據的實現代碼

2020-01-24 02:44:47
字體:
來源:轉載
供稿:網友

C#函數式程序設計之作用域

在C#中,變量的作用域是嚴格確定的。其本質是所有代碼生存在類的方法中、所有變量只生存于聲明它們的模塊中或者之后的代碼中。變量的值是可變的,一個變量越是公開,帶來的問題就越嚴重。一般的原則是,變量的值最好保持不變,或者在最小的作用域內保存其值。一個純函數最好只使用在自己的模塊中定義的變量值,不訪問其作用域之外的任何變量。

遺憾的是,有時我們無法把變量的值限制于函數的范圍內。如果在程序的初始化時定義了幾個變量,在后面需要反復用到它們,怎么辦?一個可能的辦法是使用閉包。

C#函數式程序設計之閉包機制

為了理解閉包的本質,我們分析幾個使用閉包的例子:

復制代碼 代碼如下:

namespace Closures
{
    class Closures
    {
        static void Closures()
        {
            Console.WriteLine(GetClosureFunc()(30));
        }

        static Func<int,int> GetClosureFunc()
        {
            int val = 10;
            Func<int, int> internalAdd = x => x + val;
            Console.WriteLine(internalAdd(10));
            val = 30;
            Console.WriteLine(internalAdd(10));
            return internalAdd;
        }
    }
}

此代碼的結果輸出是多少?答案是20  40  60,前面兩個值,大家應該很容易就能看出來,但第三個值為什么是60呢?先來看看程序的執行流程:Closures函數調用GetClosureFunc函數并進入其中。函數調用語句中帶了一個參數30。這是由于GetClosureFunc返回的是一個函數,即執行時再次調用了這個函數,進入GetClosureFunc函數中,首先val的值為10,通過internalAdd方法傳入一個值10,因此第一個輸出值為20,往下走,val的值變成30,通過internalAdd方法傳入值10,于是第二個輸出值為40。從這里我們大致可以看出,局部函數和局部變量如何在同一個作用域中起作用,顯然,對局部變量的改變會影響internalAdd的值,盡管變量的改變發生在internalAdd最初的創建之后。最后,GetClosureFunc返回了internalAdd方法,以參數30再次調用這個函數,于是,結果成為60。

初看起來,這并不真正符合邏輯。val應該是一個局部變量,它生存在棧中,當GetClosureFunc函數返回時,它就不在了,不是么?確實如此,這正是閉包的目的,當編譯器會明白無誤地警告這種情況會引起程序的崩潰時阻止變量值超出其作用域之外。

從技術角度來看,數據保存的位置很重要,編譯器創建一個匿名類,并在GetClosureFunc中創建這個類的實例――如果不需要閉包起作用,則那個匿名函數只會與GetClosureFunc生存在同一個類中,最后,局部變量val實際上不再是一個局部變量,而是匿名類中的一個字段。其結果是,internalAdd現在可以引用保存在匿名類實例中的函數。這個實例中也包含變量val的數據。只要保持internalAdd的引用,變量val的值就一直保存著。

下面這段代碼說明編譯器在這種情形下采用的模式:

復制代碼 代碼如下:

private sealed class DisplayClass
{
    public int val;

    public int AnonymousFunc(int x)
    {
        return x + this.val;
    }

    private static Func<int, int> GetClosureFunc()
    {
        DisplayClass displayClass = new DisplayClass();
        displayClass.val = 10;
        Func<int, int> internalAdd = displayClass.AnonymousFunc;
        Console.WriteLine(internalAdd(10));
        displayClass.val = 30;
        Console.WriteLine(internalAdd(10));
        return internalAdd;
    }
}

回到動態創建函數思想:現在可以憑空創建新的函數,而且它的功能因參數而異。例如,下面這個函數把一個靜態值加到一個參數上:

復制代碼 代碼如下:

private static void DynamicAdd()
{
    var add5 = GetAddX(5);
    var add10 = GetAddX(10);
    Console.WriteLine(add5(10));
    Console.WriteLine(add10(10));
}

private static Func<int,int> GetAddX(int staticVal)
{
    return x => staticVal + x;
}

這個原理正是許多函數構建技術的基礎,這種方法顯然與方法重載等面向對象方法相對應。但是與方法重載不同,匿名函數的創建可以在運行時動態發生,只需受另一個函數中的一行代碼觸發。為使某個算法更加容易讀和寫而使用的特殊函數可以在調用它的方法中創建,而不是再類級別上胡亂添加函數或方法――這正是函數模塊化的核心思想。

總結

閉包是程序設計語言支持函數式設計方法的一個重要工具。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产成人在线视频| 亚洲天堂色网站| 国产精品视频一区二区三区四| 色中色综合影院手机版在线观看| 日韩黄色在线免费观看| 日韩人体视频一二区| 国产一区二中文字幕在线看| 日韩电影中文字幕在线| 国产97在线视频| 亚洲在线视频观看| 亚洲人成人99网站| 最近2019年日本中文免费字幕| 国产午夜精品久久久| 欧美美最猛性xxxxxx| 91亚洲午夜在线| 国产97色在线|日韩| 庆余年2免费日韩剧观看大牛| 欧美精品久久久久久久| 热门国产精品亚洲第一区在线| 欧美性精品220| 亚洲国产精品视频在线观看| 18久久久久久| 精品久久久久久久久国产字幕| 国产91色在线播放| 欧美日韩国产丝袜美女| 国精产品一区一区三区有限在线| 久久精品99国产精品酒店日本| 欧美激情精品久久久久久变态| 亚洲国内精品在线| 精品久久久久久久久中文字幕| 欧美性xxxx极品hd欧美风情| 欧美激情在线有限公司| 亚洲国产日韩欧美在线图片| 超碰91人人草人人干| 亚洲午夜精品久久久久久久久久久久| 日韩精品中文字幕在线观看| 中文字幕国产精品久久| 日韩暖暖在线视频| 欧美大学生性色视频| 热久久视久久精品18亚洲精品| 久久网福利资源网站| 91日韩在线视频| 成人黄在线观看| 国产亚洲精品久久久久动| 欧美精品日韩三级| 国产精品综合不卡av| 中文字幕日本欧美| 日韩精品一区二区视频| 国产91九色视频| 国产欧美日韩中文字幕在线| 97av在线视频免费播放| 亚洲人精选亚洲人成在线| 中文字幕av日韩| 一本色道久久综合狠狠躁篇的优点| 欧美区二区三区| 日韩精品免费在线视频| 日韩电影免费观看在线| 色偷偷88888欧美精品久久久| 麻豆国产精品va在线观看不卡| 精品亚洲男同gayvideo网站| 亚洲自拍偷拍色图| 国产区精品在线观看| 国内精品小视频在线观看| 91成人天堂久久成人| 日韩中文字幕在线精品| 亚洲精品成人久久| 久久99国产精品久久久久久久久| 国产精品久久久久免费a∨| 午夜精品久久久久久99热| 中文字幕亚洲无线码a| 一区二区三区视频在线| 狠狠色狠狠色综合日日五| 中文字幕亚洲欧美| 韩国一区二区电影| 亚洲天堂日韩电影| 欧美极品少妇xxxxⅹ裸体艺术| 国产激情久久久| 成人精品久久久| 美日韩丰满少妇在线观看| 2019中文字幕在线观看| 国产91精品久久久| 深夜福利亚洲导航| 这里只有精品视频在线| 亚洲日本aⅴ片在线观看香蕉| 69视频在线免费观看| 美女少妇精品视频| 日韩在线欧美在线| 性欧美视频videos6一9| 国产精品wwww| 国内偷自视频区视频综合| 在线日韩av观看| 97成人精品视频在线观看| 国产午夜精品理论片a级探花| 国产精品日韩电影| 久久久久久国产精品久久| 色哟哟入口国产精品| 日韩欧美高清在线视频| www.久久撸.com| 一区二区三区动漫| 亚洲国产小视频在线观看| 欧洲日本亚洲国产区| 国产成人精品在线播放| 亚洲性视频网址| 91网站在线看| 日韩经典中文字幕在线观看| 亚洲三级免费看| 亚洲淫片在线视频| 国产婷婷97碰碰久久人人蜜臀| 成人福利网站在线观看11| 91网站在线免费观看| 精品高清一区二区三区| 最新亚洲国产精品| 日韩av手机在线| 久久精品国产一区二区三区| 欧美性精品220| 久久久精品国产亚洲| 日韩三级成人av网| 亚洲欧美日韩国产中文| 久久久免费精品视频| 欧美乱妇40p| 在线电影欧美日韩一区二区私密| 一区二区三区无码高清视频| 久久免费视频网站| 亚洲一区二区久久久| 亚洲精品99久久久久中文字幕| 日韩av片永久免费网站| 欧美日韩亚洲一区二区三区| 亚洲国产一区二区三区四区| 亚洲成av人乱码色午夜| 国产视频精品在线| 一区二区中文字幕| 青青草一区二区| 日韩有码视频在线| 久久精品视频在线播放| 欧美黄色片视频| 亚洲第一国产精品| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品一区=区| 欧美一级视频一区二区| 成人黄色免费看| 在线精品国产欧美| 精品久久久久久国产91| 91精品国产91久久久久久久久| 欧美日韩日本国产| 欧美大成色www永久网站婷| 久久精视频免费在线久久完整在线看| 日韩av免费在线看| 日韩视频永久免费观看| 国产精品成人品| 成人午夜一级二级三级| 久久久久久成人| 国产精品久久网| 欧美在线激情网| 中文字幕欧美日韩精品| 欧美二区在线播放| 青草青草久热精品视频在线网站| 国产欧美日韩中文字幕| 日韩在线观看免费高清| 中文字幕欧美日韩| 国产成人91久久精品| 高清亚洲成在人网站天堂| 亚洲第一二三四五区| 亚洲国产福利在线| 成人福利视频在线观看|