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

首頁 > 編程 > C# > 正文

C#溫故而知新系列教程之閉包

2019-10-29 21:01:52
字體:
來源:轉載
供稿:網友

閉包的由來

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

1、嵌套定義的函數。

2、匿名函數。

3、將函數作為參數或者返回值。

4、在.NET中,可以通過匿名委托形成閉包:函數可以作為參數傳遞,也可以作為返回值返回,或者作為函數變量。而在.NET中,這都可以通過委托來實現。這些是實現閉包的前提。

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

 函數式編程

函數式編程是一種編程模型,他將計算機運算看做是數學中函數的計算,并且避免了狀態以及變量的概念。這里很明顯的指出了函數式編程中最重要的就是函數而且是數學中的函數,比如f(x),數學中的函數最大的特點就是只要是同樣的參數x那么我的結果必定是相等的,也就是說我們函數的返回值只是依賴于參數而不依賴于其他狀態(比如js中的全局變量就是一個干擾因素);后一句中說避免變量的概念,這句話如果從函數式編程來說不太恰當,因為這句話中的函數意思還是我們在編程語言中所使用的變量也就是一個存儲單元,而在函數式編程中變量卻是數學中變量的定義是一個值得名稱。比如,我們最基本的賦值等式 x = x+1,讓我們程序員看這是一個簡單的賦值代碼,而讓學數學的人來說這個等式是根本不成立的。 所以我們在函數式編程中是不允許多次賦值的。而這一句話也是講述了函數式編程好處的最主要的原因:

第一點、函數的結果只依賴于參數而不依賴其他狀態,這樣寫的代碼很容易進行推理不容易發生錯誤,極大的方便的單元測試和調試。

第二點、因為不可變性和無狀態,那么我們在處理多個線程之間就不用擔心資源的爭奪,不需要用鎖來保存狀態。

高階函數

函數式編程中函數是一等公民,和我們的口號 "萬物皆對象"有點相似,在函數式編程中,我們努力用函數來表達所有的事情,當然我們也需要函數可以傳過來傳過去這就是高階函數,也就是把函數作為參數或者返回值,繼而實現復用,這樣即是可以把復用的粒度降到函數。C#語言中也有類似的東西--委托,當然C#中的函數跟函數式編程中的就不一樣了,但是有吸收一些函數式編程語言中的特性,比如C#中lamda,Linq。

關于函數式編程博客園有很多很好的文章介紹我就不詳說了,接下來就是引出我們今天的主題--閉包。

因為函數式編程的基礎就是Lambda演算,所以這一節演算我們用Lambda演算來帶出我們的主題,關于這個演算我也懂得不是太多,想要入門的同學可以看看這個  點這里

首先定義一個簡單的演算

    λx.λy.x+y

如果x為1 y為2 演算過程則為

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

接下來我們用到高階函數

   λy . (λx . x + y)

演算過程:

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

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

C#中閉包的實現

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

然后進入我們的C#編程時刻了,我們就用簡單的例子來實現,并且查看編譯器生成的代碼 看看C#中是怎么實現閉包,畢竟我們也是有委托的 。。。

首先寫一個簡單得不能在簡單的代碼   

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 在執行匿名函數的時候應該是已經釋放在作用域2就不應該存在了,而我們卻能準確的得到計算結果   

C#,閉包

說明我們的變量x確實在作用域2中還存在,接下來我們看看編譯器幫我們做了什么事情,

C#,閉包

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

C#,閉包

這個很明顯了,其實閉包只是編譯器幫我們把自由變量封裝到了一個對象中供我們作用域外使用,那我們如果去掉作用域2中使用x變量呢?

C#,閉包

編譯器原來為了自由變量維護的對象沒了 。。。結果在意料之中。

OK,這篇文章就到此結束了,關于閉包是python中啊 js中啊 或者C#中得用處我就不細說了

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品在线播放| 在线精品播放av| 青青草成人在线| 91精品国产91久久久久久吃药| 国产亚洲人成a一在线v站| 久久久久久久久久国产精品| 日韩精品在线第一页| 国产视频在线一区二区| 欧美国产激情18| 国产91色在线|免| 精品二区三区线观看| 日韩精品一区二区视频| 久久久99免费视频| 国产精品女主播视频| 亚洲va久久久噜噜噜久久天堂| 亚洲综合国产精品| 黑人巨大精品欧美一区二区三区| 精品视频在线播放| 亚洲最大av在线| 国产精品高潮视频| 日韩av一区二区在线观看| 亚洲专区中文字幕| 亚洲v日韩v综合v精品v| 一区二区亚洲欧洲国产日韩| 色偷偷亚洲男人天堂| 国产91色在线免费| 国产成+人+综合+亚洲欧美丁香花| 久久天堂电影网| 日韩av一区在线观看| 国产一区在线播放| 日韩电影免费观看在线观看| 日本亚洲精品在线观看| 欧美特级www| 国产精品久久久久不卡| 久久久久久久爱| 久久精品国产亚洲精品| 欧美日韩国产一中文字不卡| 国产亚洲精品成人av久久ww| 91精品91久久久久久| 欧美激情aaaa| 欧美视频在线观看 亚洲欧| 国产精品稀缺呦系列在线| 亚洲乱码一区二区| 亚洲精品一区二区三区婷婷月| 国产91成人在在线播放| 亚洲精品久久久久中文字幕二区| 精品毛片三在线观看| 久久精品视频99| 国产美女精品视频免费观看| 欧美激情在线视频二区| 欧美性猛交xxxx黑人猛交| 午夜精品久久久久久久99黑人| 国产视频精品自拍| 91精品国产91久久久久久| 正在播放亚洲1区| 欧美一级免费视频| 97视频在线观看免费高清完整版在线观看| 成人国内精品久久久久一区| 欧美激情精品久久久久久变态| 欧美国产日韩免费| 色哟哟入口国产精品| 亚洲国产精品久久| 久久久99免费视频| 欧美中文在线免费| 91久久久精品| 亚洲乱码av中文一区二区| 国产精品久久久久aaaa九色| 亚洲欧美第一页| 亚洲综合在线中文字幕| 91在线免费观看网站| 国产亚洲a∨片在线观看| 992tv成人免费影院| 色婷婷av一区二区三区久久| 久热精品视频在线免费观看| 中文字幕一区二区三区电影| 亚洲天堂网站在线观看视频| 69视频在线免费观看| 一区二区国产精品视频| 国产午夜精品视频免费不卡69堂| 日韩电视剧在线观看免费网站| 国产精品欧美久久久| 91久久在线播放| 亚洲精品小视频| 中文字幕亚洲一区在线观看| 国产精品一区二区三区久久| 68精品国产免费久久久久久婷婷| 在线电影欧美日韩一区二区私密| 久久久久国产精品免费| 国产成人亚洲综合青青| 国产一区二区三区高清在线观看| 日本亚洲欧美成人| 国产精品入口日韩视频大尺度| 国产亚洲精品激情久久| 亚洲福利视频二区| 午夜精品一区二区三区在线视频| 日韩国产一区三区| 久久男人av资源网站| 色爱精品视频一区| www.日韩av.com| 91影视免费在线观看| 国产日韩欧美中文在线播放| 亚洲国产精品中文| 韩国美女主播一区| 中文字幕亚洲一区在线观看| 国模叶桐国产精品一区| 国产精品福利观看| 久热99视频在线观看| 国产亚洲欧洲在线| 日韩电影中文 亚洲精品乱码| 欧美另类老肥妇| 日韩小视频在线观看| 91精品国产沙发| 国产一区二区欧美日韩| 亚洲精品久久久久| 亚洲欧美国产精品专区久久| 成人黄色片网站| 91久久精品国产91久久性色| 日韩av三级在线观看| 国产综合色香蕉精品| 日本高清视频一区| 成人黄色在线免费| 久久视频在线播放| 麻豆国产精品va在线观看不卡| 国产精品入口夜色视频大尺度| 成人av在线天堂| 亚洲精品免费网站| 国产成人自拍视频在线观看| 亚洲国产成人精品电影| 国产主播在线一区| 欧美性猛交xxxx免费看| 欧美日韩国产激情| 久色乳综合思思在线视频| 亚洲欧美制服中文字幕| 国产美女搞久久| 久久精品国产一区二区电影| 欧美激情在线狂野欧美精品| 久久免费视频这里只有精品| 久久成人18免费网站| 日韩电影大全免费观看2023年上| 亚洲国产日韩欧美综合久久| 日韩成人av网| 久久久久国色av免费观看性色| 日韩中文视频免费在线观看| 精品久久国产精品| 国内精品美女av在线播放| 欧美激情综合色综合啪啪五月| 秋霞午夜一区二区| xxav国产精品美女主播| 亚洲美女av黄| 精品激情国产视频| 91久久在线观看| 91chinesevideo永久地址| 国产精品自产拍高潮在线观看| 亚洲色无码播放| 亚洲成人av在线| 国产精品美女在线观看| 亚洲免费人成在线视频观看| 亚洲精品国产综合区久久久久久久| 超薄丝袜一区二区| 一区二区av在线| 国产日韩视频在线观看| 日韩一区二区精品视频| 亚洲久久久久久久久久久| 国产欧美在线视频|