激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#溫故而知新系列教程之閉包

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

2022-02-24 13:54RstarYan C#

閉包是將一些執行語句的封裝,可以將封裝的結果像對象一樣傳遞,在傳遞時,這個封裝依然能夠訪問到原上下文。下面這篇文章主要給大家介紹了關于C#中閉包的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考

閉包的由來

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

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#中是怎么實現閉包,畢竟我們也是有委托的 。。。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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#中得用處我就不細說了

總結

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

原文鏈接:http://www.cnblogs.com/rstar/p/closure.html

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
主站蜘蛛池模板: av电影免费在线看 | 久久亚洲成人网 | 国产女做a爱免费视频 | 国产亚洲精品久久久久久久久久 | 日本欧美一区二区三区视频麻豆 | 性爱视频在线免费 | 午夜精品福利视频 | 久久新地址 | 中文在线观看www | 性色av一区二区三区在线观看 | 欧美特黄一级高清免费的香蕉 | 性盈盈盈影院 | 国产自91精品一区二区 | 免费观看9x视频网站在线观看 | 色婷婷久久一区二区 | 日本aⅴ在线 | 成人免费福利视频 | 中文日产幕无线码6区免费版 | 色婷婷tv | 亚洲精品无码不卡在线播放he | 亚洲婷婷日日综合婷婷噜噜噜 | 日本看片一区二区三区高清 | 亚洲国产在 | 久久久一区二区三区四区 | 成人午夜视频免费在线观看 | 91在线免费观看 | 毛片一级网站 | 日本精品久久久久 | 精品国产一区二区久久 | 欧美一级电影在线观看 | 欧美女同hd | 欧美一级网站 | 龙床上的呻吟高h | 7777欧美| av中文字幕免费在线观看 | 91av久久 | 国产91久久久久久 | 成人免费观看在线 | 在线 日本 制服 中文 欧美 | a集毛片| 国内精品久久久久久久久久久久 |