最近在看深入理解c#,發現這是一本很不錯的書,將很多c#的知識點聯絡了起來,更像是一本c#歷史書,從c# 1一步步介紹到c# 4。
所以準備一邊看,一邊整理讀書筆記。那麼就先從委託開始。
委託是c#中乙個非常重要的概念,從c# 1開始就有了委託這個核心概念,在c# 2和c# 3中委託又有了很多改進。
通過委託,我們可以將乙個方法當作物件封裝起來,並且在執行時,我們可以通過這個物件來完成方法的呼叫。
首先,來個簡單的例子,蘋果只負責設計iphone,而把組裝iphone的工作委託給富士康做。
class從上面的例子中,可以體會一下委託的使用。使用委託需要滿足}class
foxconn
}class
program
}
4個條件:
宣告乙個委託型別
找到乙個跟委託型別具有相同簽名的方法(可以是例項方法,也可以是靜態方法)
通過相同簽名的方法來建立乙個委託例項
通過委託例項的呼叫完成對方法的呼叫
當我們使用委託的時候,一定要注意這兩個概念。
委託型別,是通過delegate關鍵字宣告的一種型別,例如上面例子中的:
public注意,"assembleiphonehandler"是乙個委託型別,它有自己的方法,可以建立相關的例項。通過"ilspy"可以看到"assembleiphonehandler"的方法以及父類資訊。delegate
void assembleiphonehandler();
委託型別的宣告過程中描述了該委託型別的簽名(返回型別,引數列表),這個簽名就決定了那個方法可以用來建立乙個改委託型別的委託例項;同時,這個簽名還表示了該委託例項呼叫的簽名。
而委託例項,就是通過委託型別進行例項化的物件,例如上面例子中的:
在建立委託例項的過程中,我們需要找到乙個跟委託型別簽名相同的方法來完成委託例項的建立。
接著上面的例子進行修改,這次來看看委託的合併和刪除。
class當我們呼叫委託例項的時候,委託例項的呼叫列表中的所有操作會依次被執行。foxconn
public
void
packiphone()
public
void
shipiphone()
}class
program
}
注意,一般在**中,很少直接使用combine和remove方法的顯式呼叫,而是通過"+="和"-="操作符來實現。
這裡有一點要提的是,委託是不易變的,一旦建立了乙個委託例項後,這個例項的所有內容都不能被改變了(就像string一樣,string也是不易變的)。
所以說combine和remove都沒有改變委託例項,都是新建了乙個委託例項。
在使用呼叫列表的時候,有些關鍵點需要注意一下,假如說乙個委託例項的呼叫列表為[methoda, methodb, methodc]。那麼當我們呼叫委託例項的時候,methoda, methodb, methodc會依次被執行。
如果上面a-c三個方法都有返回值,我們只能得到最後乙個操作的返回值,其他的返回值都將被忽略。
如果呼叫列表中的乙個操作有異常,那麼所有的下游操作都不會被執行。
舉例,我們在packiphone方法中加入乙個異常,那麼委託列表中的shipiphone操作將不會被執行到:
class對於上面兩個問題,我們可以通過委託例項的getinvocationlist()方法,通過這個方法可以得到呼叫列表中的所有操作。foxconn
public
void
packiphone()
public
void
shipiphone()
}class
program
catch
console.read();}}
這樣,就可以顯示呼叫委託來進行異常處理或者返回值的儲存。
catch}
本文介紹了委託的基本概念,以及委託型別和委託例項的區別。
委託本質上是乙個派生自system.multicastdelegate的類,我們可以通過特定的(與委託型別簽名相同)的方法建立委託例項,通過委託是,可以間接完成某些操作。
同時,可以通過combine和remove操作來進行委託例項的呼叫列表的合併和刪除。
委託的基本概念
最近在看深入理解c 發現這是一本很不錯的書,將很多c 的知識點聯絡了起來,更像是一本c 歷史書,從c 1一步步介紹到c 4。所以準備一邊看,一邊整理讀書筆記。那麼就先從委託開始。委託是c 中乙個非常重要的概念,從c 1開始就有了委託這個核心概念,在c 2和c 3中委託又有了很多改進。通過委託,我們可...
Delegate 委託複習 委託的基本概念
1 宣告乙個delegate物件,它應當與你想要傳遞的方法具有相同的引數和返回值型別。宣告乙個 的例子 public delegate int mydelegate string message 2 建立delegate物件,並將你想要傳遞的函式作為引數傳入。建立 物件的方法 1 mydelegat...
基本概念 C 基本概念
由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...