C 中的委託

2022-09-15 06:57:11 字數 1681 閱讀 4010

選擇自 lotusswan 的 blog

簡介 委託是c#中的一種引用型別,類似於c/c++中的函式指標。與函式指標不同的是,委託是物件導向、型別安全的,而且委託可以引用靜態方法和例項方法,而函式指標只能引用靜態函式。委託主要用於 .net framework 中的事件處理程式和**函式。

乙個委託可以看作乙個特殊的類,因而它的定義可以像常規類一樣放在同樣的位置。與其他類一樣,委託必須先定義以後,再例項化。與類不同的是,例項化的委託沒有與之相應的術語(類的例項化稱作物件),作為區分我們將例項化的委託稱為委託例項。

函式指標

乙個函式在編譯時被分配給乙個入口位址,這個入口位址就稱為函式的指標,正如同指標是乙個變數的位址一樣。

函式指標的用途很多,最常用的用途之一是把指標作為引數傳遞到其他函式。我們可以參考下面的例子進一步理解函式指標作為引數的情況:

# include

int max(int x,int y)

int min(int x,int y)

public static int min(int a,int b)

public static int sub(int a,int b)

public static int minus(int a,int b) }

class handler }

} class test }

我們還可以宣告乙個委託陣列,就像宣告乙個物件陣列一樣,上面的例子中就使用到了委託陣列;乙個委託還可以封裝多個方法(多路廣播委託,經常與事件處理程式結合使用),只要這些方法的簽名是正確的。多路廣播委託的返回值一般為void,這是因為乙個委託只能有乙個返回值,如果乙個返回值不為void的委託封裝了多個方法時,只能得到最後封裝的方法的返回值,這可能和使用者初衷不一致,同時也會給管理帶來不方便。如果你想通過委託返回多個值,最好是使用委託陣列,讓每個委託封裝乙個方法,各自返回乙個值。

事件 在c#中,委託的最基本的乙個用處就是用於事件處理。事件是物件傳送的訊息,以發訊號通知操作的發生,通俗一點講,事件就是程式中產生了一件需要處理的訊號。

事件的定義用關鍵字event宣告,不過宣告事件之前必須存在乙個多路廣播委託:

public delegate void calculate(int x,int y);//返回值為void的委託自動成為多路廣播委託;

public event  calculate oncalculate;

從上節的委託例項和上面的事件的宣告可以看出,事件的宣告僅僅是比委託例項的宣告多了個關鍵字event,事實上事件可以看作是乙個為事件處理過程定製的多路廣播委託。因此,定義了事件後,我們就可以通過向事件中操作符+=新增方法實現事件的預定或者是通過-=取消乙個事件,這些都與委託例項的處理是相同的。與委託例項不同的是,操作符=對於事件是無效的,即

oncalculate=new calculate(sub) ;//無效

只是因為上面的語句會刪除由oncalculate封裝的所有其他方法,指封裝了由此語句指定的唯一方法,而且乙個預定可以刪除其他所有方法,這會導致混亂。

**函式

**函式是在託管應用程式中可幫助非託管 dll 函式完成任務的**。對**函式的呼叫將從託管應用程式中,通過乙個 dll 函式,間接地傳遞給託管實現。在用平台呼叫呼叫的多種 dll 函式中,有些函式要求正確地執行託管**中的**函式。關於**函式只是使用到委託,在此不加過多說明,具體實現可參考下圖:

作者blog:

C 中的委託

委託是個比較讓人費解的東西,最近把這個東西翻來覆去看了幾遍了,有了些想法,希望能對同樣卡在這裡的同志一些啟發。在這裡主要提供一種理解思路,畢竟像基本語法 規範之類的,查參考書是最好的了。首先來看看乙個宣告乙個物件的過程 class someclass 定義乙個類 someclass sample 宣...

C 中的委託

c 中的委託 引言 c 中的委託著實讓我迷惑 我是位初學者 在不同的c 書籍中,還譯為 委派等,經反覆查閱資料和自己動手編寫 才稍稍理出點頭緒。c 中的委託類似於c或c 中的函式指標,但兩者有本質區別 c或c 不是型別安全的,但c 中的委託是物件導向的,而且是型別安全的。從技術角度來講,委託是乙個引...

C 中的委託

1.委託概述 委託是c 中新加入的乙個型別,可以把它想作乙個和class類似的一種型別,和使用類相似,使用乙個委託時,需要兩個步驟,首先你要定義乙個委託,就像是定義乙個類一樣 然後,你可以建立乙個或多個該委託的例項。定義乙個委託的語法是這樣的 public protected private del...