委託學習(1) 函式指標的改頭換面

2021-04-13 07:35:17 字數 3389 閱讀 8285

又是提起委託,我在想的是眾人必定皆惱怒,有關這個東西的談論網上已悠悠不盡,何況我也不是趕時髦,追潮流的人,因此必然無法標新立異;只是把我學習的一些感受作以記錄,便於日後回憶,也願對各位朋友有點幫助。

對於學習

c/c++

語言的朋友,函式指標相信都不會覺得遙遠和陌生吧,不管你對它是恨是愛,還是它令你憂傷令你逍遙自在;如果現今你還在使用

c/c++

,馳騁在

win32

平台下怡然自樂,那麼有它相伴身邊你肯定不會覺得寂寞;如果你已告別

c/c++

,徜徉在

.net

平台下悠然自得,那麼沒有了它相伴你也肯定不會覺得失落,因為乙個名曰委託(

delegete

)的朋友已翩然來到我們身邊,所以我們用不著遺憾,更用不著千年一嘆,因為委託可以稱得上是函式指標的改頭換面。

地球人都知道,函式指標的主要作用就是用它來呼叫函式的,那乙個函式好端端的為什麼不用人家的名字直接呼叫,偏偏的拐個彎用指標來呼叫呢?當然普通的呼叫直接用名字就可以了,但當我們想把函式作為引數來傳遞,就得靠函式指標;還有在程式界大名鼎鼎的**函式(

callback function

),它風光的背後也是函式指標在默默奉獻。那麼在

.net

託管環境下,微軟狠心割捨了函式指標這一不求名利的功臣,但沒讓我們失望的是增添了委託這一良將,把函式指標的功能發揮的淋漓盡致。還是來回憶一下我們的老朋友函式指標,正好這幾天我也正在實行一驚天計畫,準備對我暗戀已久的一女孩說出心裡話,無奈我沒經驗又害羞,多次欲言卻又口難開,所以準備托一好友幫忙先給她點暗示,完了我再隨後出擊,借寫本文機會來場紙上談兵。首先用函式指標模擬一下這個計畫,妥當與否,姑且不作理論。

class

liyufeng

}; 上面這個類用我大名的拼音來命名,算是代表我這個無緣愛情的苦命人。我要說的話由靜態方法

mysay

來說出,此處只是輸出到控制台,要是真能對人家說了就高興死俺了。

class

good

friend

}; 上面的這個類代表我的好朋友,姓名就不透露了,免得太多的像我這樣的不敢對女孩表白的人都去找他這個愛管閒事的傢伙,哦,他可就忙不過來啦。我的話呢通過這裡的

friendsay

方法逐句逐字的說給女孩聽。朋友代表我和女孩見面的地點定在乙個美麗的公園裡。

class

beautifulpark

} 我和朋友一起先到公園,小心翼翼的把我說話的那個方法

mysay

給了朋友的

friendsay

方法,為什麼要小心?函式指標嘛,不是個省心的東西,當然得小心嘍。好了,後邊的事情我就不得而知了,天知道女孩聽了俺的話作何反應。

我的話說完了,同時和大家一起回憶了函式指標,沒經歷過亙古悠香的

c/c++

語言而是直接和

.net

下語言做親密接觸的朋友,看了上面的幾行**有沒有感覺似曾相識?沒有的話,下面我再來模擬一下

c#委託版本的。

class

liyufeng }

這個liyufeng

類和上面的

c++版本的不同的只是輸出到控制台用的方法不一樣。

class

goodfriend }

我的好朋友

goodfriend

類和前邊的

c++版本非常相似,唯一不同的是指標換成了委託,但完成的是同樣的功能。

class

beautifulpark }

好了,我追求緣分的計畫也用委託班門弄斧的模擬了一番,到此為止,熟悉函式指標還沒接觸過委託的朋友,還有熟悉委託卻對函式指標陌生的朋友,回頭看一下,函式指標和委託是否頗為相似?在我初次接觸委託的時候,也是被這個傢伙搞的糊里糊塗,後來明白了,在

.net

託管環境下的相關語言都是以物件導向作為基礎來構建設計,一切都是物件,那麼在這個物件叢生的世界裡,擺脫物件這件外衣的成員是不允許存在的,也就是所有的成員都是從物件的老祖先

object

派生而來。指標作為

c/c++

中一種特殊的資料型別,如果想在託管環境下生存的話,必然也是

object

的後代,所謂入鄉隨俗,自然的也得披上物件的行套;所以對於函式指標而言,便是以乙個物件封裝了我們想要呼叫函式的所有相關資訊,可以肯定這其中包含我們要呼叫函式的位址資訊。當然

c#等語言也只是對函式指標進行了型別化,給它改了個頭,換了個面,起了個名叫

delegate

,中文喚作委託;而對於其它資料型別的指標,並沒有這麼做,因此也就意味著我們是不可以像在

c/c++

中那樣,自由自在的隨意操作記憶體,這都是出於安全性的考慮。其實我覺得「委託」這個詞起初理解起來真是有點讓人抓耳撓腮的,想一下,你第一眼看到這個詞什麼感覺?能一下子就想到它是做函式呼叫的嗎,能感覺的到它和函式指標有淵源嗎?記得孟老大在一篇文章中談到過「指標」這個詞有誤引理解思路之嫌,嘿嘿!有點跑題了。

指標的本質我們都知道,就是其所指向成

員的記憶體位址,函式指標就是要呼叫函式的內

存位址了,位址就是赤裸裸的位址,除了這一

位址資訊之外其它的一無所有,如關於引數和

返回值等的資料型別資訊,而委託就不同,委

託並不單純的是呼叫函式的位址,它本質上是

乙個類,經過對函式指標的這麼一型別化的封

裝,包含進了資料型別等很多資訊,因此委託

被稱之為型別安全的指標。青出於藍勝於藍,

委託還有比函式指標強大的地方,回頭看一下 前面

c++的一行**: //

注意,此處必須宣告為靜態方法。

public:

static

void mysay() {}

為什麼必須宣告為靜態方法

?再看一下

c#的**:

//注意,此處可以不宣告為靜態方法

public

static

void mysay(){}

為什麼這裡可以不宣告為靜態方法

?這裡我們可以清楚的是

,c++

中用函式指標來呼叫的函式必須是靜態的

(c語言裡這點無關緊要

),而在

c#中用委託來呼叫的函式可以是靜態的

,也可以不是

.還不僅僅如此

,函式指標一次只能實現對乙個函式的呼叫

,而委託沒有這個限制

,可以實現一次呼叫多個函式

.這次就要到這裡了

,簡單的寫了一些自己對委託的理解

,發現寫文章的確是辛苦哦

,不管是寫好寫壞

,都是一種學習

,一種對自己負責任的學習

.後面的文章我將嘗試討論委託背後的實現機制

,加深對其的理解

,看一下委託究竟是如何構造出來的

.

C 委託 C函式指標

c 高階程式設計 裡說 net已委託的形式實現了函式指標的概念 這裡簡單比較一下兩者的區別 1 首先看看c下的 函式指標 如何宣告和定義乙個函式變數 typedef int func int x,int y 宣告 func func 定義乙個 函式變數 當已經有這樣乙個實現的函式時 int some...

2017 3 8 函式指標 事件 委託

函式指標 定義 函式指標是指向函式的指標變數。因而 函式指標 本身首先應是指標變數,只不過該指標變數指向函式。這正如用指標變數可指向整型變數 字元型 陣列一樣,這裡是指向函式。函式指標有兩個用途 呼叫函式和做函式的引數。例 int function int c 宣告乙個函式 int funcpoin...

C 之委託學習(1)

委託是一種資料結構,它引用靜態方法或引用類例項及該類的例項方法。我們看看下面的例子 int i 100 定義乙個整形數。public delegate string getstring 定義乙個委託getstring,它返回string型別。getstring firstmethod new get...