国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C#中的閉包是怎么捕獲變量的

開發 后端
閉包是可以包含自由(未綁定)變量的代碼塊;這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義。本文主要介紹了C#中的閉包是怎么捕獲變量的。

簡單來講,閉包允許你將一些行為封裝,將它像一個對象一樣傳來遞去,而且它依然能夠訪問到原來***次聲明時的上下文。這樣可以使控制結構、邏輯操作等從調用細節中分離出來。訪問原來上下文的能力是閉包區別一般對象的重要特征,盡管在實現上只是多了一些編譯器技巧。

我們知道,在匿名方法或者lambda中,可以訪問或者修改該匿的定義范圍內的變量。例如:

  1. int num = 1;   
  2. Func<int> incNum = () => ++num; 

其中lambda表達式使用了在其外部定義的變量num。我們可以認為該段lambda語句塊構成了一個閉包,而這個閉包捕獲了外部變量num。

好了,不說那么多讓人看著難受的定義套話了。我們進入正題,看看在C#中變量是如何被捕獲的。來看一個例子:

  1. public Func<String> CreateFunction()   
  2. {   
  3. String str = "我的幸運數字是";   
  4. int num = 17;   
  5. Func<String> func = () => str + num;   
  6. return func;   

在這個例子中,定義了一個返回一個函數的方法CreateFunction。返回的函數構成了一個閉包,該閉包捕獲了兩個變量:String類型的str和int類型的num。

好了,我們現在可以這樣使用這個函數了:

  1. Func<String>   
  2. myFunc = CreateFunction();   
  3. String result = myFunc();  

我們來分析一下這兩行代碼實際都干了什么。***行很容易理解,我們把方法CreateFunction生成的匿名函數賦值給了委托myFunc。

第二行更好理解,我們執行了myFunc,并將返回結果賦值給了變量result。我們再深入思考一下:在執行myFunc的時候,會訪問到在CreateFunction中定義兩個變量str與num。

雖然這時CreateFunction的棧幀早就被銷毀了,其內部定義的變量至今也“生死不明”了,但是因為我們知道這兩個變量已經被閉包所捕獲了,所以我們堅信這兩個變量截至目前為止還是可以訪問的!

對于str對象,鑒于它是一個引用類型,所以只要有存在某個“東西”一直保存著對它的引用,它就不會被銷毀。這樣我們完全不用擔心在我們需要它時,編譯器或運行時會告訴我們它被弄丟了。

然而對于num,情況就有些不同了。num是一個值類型。我們知道值類型是存活在棧上的,我們也知道它所存在的那個棧幀(也就是CreateFunction的幀)在CreateFunction執行完畢后就會被銷毀,然后其上存在的任何值類型也會被一并的銷毀,這其中當然包括我們所關注的變量num了。

那么,我們為什么還能安全的訪問num呢?C#中的變量捕獲機制究竟有什么神奇之處,可以讓值類型擁有違反常規的生存周期呢?裝箱!你可能會立刻想到,把每個值類型都裝到一個對象里,我們就可以讓這個值類型擁有和那個包裹它的對象相同的壽命了。

不過,這并不是C#實現者所選擇的方式!C#并不會對每個需要捕獲的值類型變量進行裝箱操作,而是把所有捕獲的變量統統放到同一個大“箱子”里——當編譯器遇到需要變量捕獲的情況時,它會默默地在后臺構造一個類型,這個類型包含了每一個閉包所捕獲的變量(包括值類型變量和引用類型變量)作為它的一個公有字段。這樣,編譯器就可以

維護那些在匿名函數或lambda表達式中出現的外部變量了。

更進一步,如果我們使用ILDASM工具查看CreateFunction方法的IL代碼,我們會發現編譯器壓根就沒有聲明num和str變量。取而代之的是聲明了一個類型名和實例名都及其難看的包裝對象。這個玩意兒就是我們上面所說的那個被編譯器默默生成,保存了所有捕獲變量的引用的對象。

我們還可以看到,在CreateFunction方法,C#源代碼內所有對str和num的操作,在IL中都被轉換成了對包裝對象的同名公有成員的操作。順便說一句,就連我們構造的那個lambda表達式“() => str + num”現在都被編譯器轉換成了這個包裝對象的一個方法!

【編輯推薦】

  1. 使用ASP.NET操作IIS7中使用應用程序
  2. SqlParameter的作用與用法
  3. ASP.net的身份驗證方式FORMS
  4. C#使用MemoryStream類讀寫內存
  5. C#控件的閃爍問題解決方法總結
責任編輯:于鐵 來源: 博客園
相關推薦

2011-08-05 09:33:30

Func局部變量作用域

2023-09-11 08:20:17

對象閉包底層

2021-10-26 13:18:52

Go底層函數

2022-06-08 08:01:20

useEffect數組函數

2024-01-08 08:35:28

閉包陷阱ReactHooks

2024-11-26 00:45:29

free區域字段

2024-03-11 16:13:26

C#編程開發

2025-04-29 10:30:00

C++Lambda函數

2019-11-07 21:51:18

閉包前端函數

2016-11-01 09:18:33

Python閉包

2012-11-29 10:09:23

Javascript閉包

2020-05-28 15:41:48

微軟C+語言

2022-05-30 16:19:26

C#多態底層虛方法

2023-11-02 08:53:26

閉包Python

2024-01-22 09:51:32

Swift閉包表達式尾隨閉包

2011-05-12 18:26:08

Javascript作用域

2009-07-31 18:39:31

C#中foreach引

2009-07-22 07:43:00

Scala閉包

2023-01-09 08:00:41

JavaScript閉包

2020-12-16 11:09:27

JavaScript語言開發
點贊
收藏

51CTO技術棧公眾號

欧美国产视频一区| 男人添女荫道口图片| 精品欧美一区二区三区在线观看| 国产区在线观看成人精品| 久久天堂国产精品| 97精品一区二区视频在线观看| 国产在线观看网站| **性色生活片久久毛片| 虎白女粉嫩尤物福利视频| 国产一区二区三区四区五区美女| 日韩国产一区久久| 久久精品人人| 久久综合狠狠综合久久综青草| 在线电影一区二区| 国产色综合天天综合网| 日本一区二区免费高清| 日韩美女毛茸茸| caoporen人人| 国产精品色哟哟| 丰满少妇在线观看| 国产精品久久久久毛片软件| 15—17女人毛片| 亚洲视频在线一区观看| 成人亚洲一区二区三区| 亚洲色图丝袜美腿| 一本到av在线| 日本道色综合久久| 精品国产99久久久久久| 精品国精品国产尤物美女| 美女视频在线免费| 色小说视频一区| 国产青青视频| 亚洲精品国产无套在线观| 3344永久| 欧美在线免费视屏| 俄罗斯av网站| 国产嫩草影院久久久久| 浪潮av在线| 搞黄网站在线观看| 亚洲福利视频二区| 色琪琪原网站亚洲香蕉| 国产视频一区二区视频| 神马伦理电影| 国产98色在线|日韩| 免费h片在线| 久久先锋资源网| 精品国产一区二区三区小蝌蚪| 亚洲欧洲精品一区二区| 亚洲激情一区| 国产精品乱码| 美腿丝袜亚洲一区| 777av视频| 亚洲天堂a在线| 四虎精品在线| 91精品国产乱| 91吃瓜在线观看| 久久成年人免费电影| 日韩美女精品| 国产激情美女久久久久久吹潮| 三级在线观看一区二区| 国产一区在线看| 欧美一级在线看| 亚洲激情成人在线| 免费av在线网站| 色妞色视频一区二区三区四区| 大奶一区二区三区| 亚洲www视频| 久久精品72免费观看| 国产l精品国产亚洲区久久| 亚洲一区二区三区四区五区中文| 成人午夜电影在线观看| 自拍偷拍亚洲精品| 清纯唯美日韩| 一区二区免费电影| 国产99亚洲| 久久99精品久久久久久秒播放器 | 日本一区二区动态图| 四虎影院在线域名免费观看| 亚洲国产99精品国自产| 免费萌白酱国产一区二区三区| 99免费在线观看视频| 99视频超级精品| avtt亚洲| 午夜精品福利在线观看| 日本aⅴ精品一区二区三区| 亚洲an天堂an在线观看| 亚洲国产精品大全| 日韩一区二区中文| 女人被男人躁得好爽免费视频| 午夜私人影院久久久久| 激情久久一区二区| 免费一区二区三区在在线视频| 欧美激情在线免费观看| xxx性欧美| 亚洲自拍偷拍网址| 国产精品人人做人人爽人人添| 污网站在线免费看| 日韩中文第一页| 日韩精品亚洲专区| 在线黄色.com| 久久免费高清视频| 精品一区二区三区在线观看 | 国产精品69av| av中文一区二区三区| 国产在线高清视频| 国产成人精品视| 久久亚洲影视婷婷| 一个人看的www视频在线免费观看| 7777精品伊久久久大香线蕉语言| 欧美高清在线一区| 丰满少妇一区| 欧美 日韩 国产 在线观看| 欧美综合亚洲图片综合区| 欧美日韩另类图片| 欧美变态另类刺激| 国产亚洲欧美日韩一区二区| 乱人伦精品视频在线观看| 新欧美整片sss第一页| 国产精品福利无圣光在线一区| 国产欧美日韩在线| 99久热在线精品视频观看| 日日噜噜夜夜狠狠久久丁香五月| 日韩午夜在线观看| 日本vs亚洲vs韩国一区三区二区| 免费黄色在线看| 国产亚洲自拍偷拍| 色先锋aa成人| 亚洲经典自拍| 国产原创在线观看| 免费久久久一本精品久久区| 精品视频全国免费看| 亚洲精品123区| 五月婷婷视频在线观看| 日本一区二区三区视频在线播放| 91精品综合久久久久久| 青青草伊人久久| 岛国av在线播放| 妞干网在线播放| 久久夜色精品国产亚洲aⅴ| 久久久久88色偷偷免费| 精品久久对白| 嫩草嫩草嫩草| 亚洲va电影大全| 欧美日本一区二区三区| 久久天堂成人| 欧洲亚洲两性| 999在线免费视频| 国产成人黄色av| 福利微拍一区二区| 亚洲国产高清一区二区三区| 成人在线观看一区| 日产国产精品精品a∨| 亚洲欧美日韩在线高清直播| 91在线视频官网| 成人一区二区三| 欧美激情一区二区三区在线视频观看| 久久嫩草精品久久久久| 欧美顶级毛片在线播放| 中出在线观看| 免费国产一区| 国产亚洲精品久久久久久牛牛| 91天堂素人约啪| 欧美交a欧美精品喷水| 在线国产中文字幕| 日韩av一级大片| 久久精品欧美视频| 亚洲成人精品影院| 老司机精品福利视频| **日韩最新| 少妇激情av一区二区| 欧美精品一区二区三区久久| 亚洲欧美国产日韩天堂区| 国产欧美一区二区精品性色超碰| 国产成人三级| 9191在线播放| 日韩精品一区二区三区不卡| 国产精品老女人视频| 日韩美一区二区三区| 久久久综合精品| 樱桃成人精品视频在线播放| 热三久草你在线| www.色就是色| 99久久伊人精品影院| 一区二区三区四区视频| 亚洲一区二区综合| 日本中文一区二区三区| 国产精品视屏| 婷婷成人激情| 女人扒开屁股爽桶30分钟| 亚洲综合精品一区二区| 在线亚洲国产精品网| 欧美色videos| av男人天堂一区| 国产专区一区| 在线观看国产一级片| 91视频国产精品| 伊人久久精品视频| 在线日韩一区二区| 久久众筹精品私拍模特| 极品尤物久久久av免费看|