委託是c#中最為常見的內容。與類、列舉、結構、介面一樣,委託也是一種型別。類是物件的抽象,而委託則可以看成是函式的抽象。乙個委託代表了具有相同引數列表和返回值的所有函式。比如:
delegate int getcalculatedvaluedelegate(int x, int y);
在上面的定義中,我們定義了乙個委託,這個委託代表著一類函式,這些函式的第乙個引數是整數型的x,第二個引數是整數型的y,而函式的返回值則是乙個整數。在這裡,為了描述方便,我們把這一類的函式稱為具有相同簽名(signature)的函式(注意:這個簽名並不是數字簽名中的概念,而只是表示這類函式具有相同的引數列表和返回值)。
既然委託是一種型別,那麼它就能被用來定義引數、變數以及返回值。由委託定義的變數用於儲存具有相同簽名的函式實體。需要注意的是,c#和c++不同,c++中的函式指標只能儲存全域性的或者靜態的函式,而c#中的委託實體則可以指代任何函式。
現在我們來看乙個例子,在這個例子中,我們使用了上面定義的那個委託,並建立了乙個委託實體,使其指代程式中的addcalculator函式,接下來就可以直接像使用函式本身一樣,使用這個委託實體來獲得計算的結果。
delegate int getcalculatedvaluedelegate(int x, int y);
static int addcalculator(int x, int y)
static int subcalculator(int x, int y)
static void main(string args)
到這裡也就能基本上明白「委託」的意義了,針對上面的main函式,本來需要呼叫addcalculator函式的,卻通過d來呼叫了,也就是,後續對addcalculator的操作由d代為效勞。本來是要小明去老師辦公室拿粉筆盒的,由於小明和小文是好朋友,因此小明就要小文代他去拿,於是小文成了小明的**,小明委託小文去拿粉筆盒。
現在我們來考慮委託作為引數的情形。將委託作為引數,可以把函式本身的處理邏輯抽象出來,而讓呼叫者決定最終使用什麼樣的邏輯去處理。請看下面的例子:
delegate int getcalculatedvaluedelegate(int x, int y);
static int addcalculator(int x, int y)
static int subcalculator(int x, int y)
static int calculator(getcalculatedvaluedelegate del, int x, int y)
static void main(string args)
在上面的例子中,calculator函式的第乙個引數就是乙個委託。事實上,calculator對x和y將會做什麼處理,它本身並不知道,如何處理x和y由getcalculatedvaluedelegate來決定。那麼在main方法裡,我們將addcalculator方法作為引數傳遞給calculator,表示讓calculator用addcalculator的邏輯去處理x和y。這也很形象:calculator說:「我不知道要怎麼處理x和y,讓del去處理好了!」於是就把x和y扔給了del。
這種做法其實跟「模板方法模式」有點點類似。在模板方法模式中,可以將可變的部分留給子類去重寫,而將不變的部分由父類實現。那麼在委託作為引數的情況下,calculator可以自己處理不變的邏輯,而將「具體怎麼做」的事情委託給他人去辦理。
委託作為返回值一般會用在「根據不同情況決定使用不同的委託」這樣的情形下。這有點像工廠模式,不過委託用作返回值還是用的沒有用作引數這樣頻繁。
C 委託基礎1 委託基礎
委託和其委託的方法必須具有相同的簽名。簽名相同 1.引數型別相同 2.引數數量相同 3.返回值一致 例一 class program static void main string args mm 7,6 console.readline 例二 class program double subtra...
c 委託基礎
委託 1.概念 委託是函式的封裝,它代表一 類 函式。它們都符合一定的簽名 擁有相同的引數列表 返回值型別。同時,委託也可以看成是對 函式的抽象,是函式的 類 2.語法 delegate argument list 3.用法 1.宣告委託,比如 public delegate void del st...
C 基礎 委託
一 委託 當我們需要把方法做為引數傳遞給其他方法的時候,就需要使用委託。因為有時候,我們要操作的物件,不是針對資料進行的,而是針對某個方法進行的操作。我們還是來以 入手 using system using system.collections.generic using system.linq u...