C#的委託事件總結
什麼是委託?
1.委託是C#中由使用者自定義的一個型別。
2.類表示的是資料和方法的集合,而委託實際上是一個能持有對某個或某些方法的引用的類。
3.與其他的類不同,委託類能擁有一個簽名,並且他只能持有與他的簽名相匹配的方法的引用。
如何使用委託
1.宣告一個委託型別。
2.使用一個委託型別宣告一個委託變數。
3.建立委託型別的物件,把它賦值給委託變數。該委託物件包含某個方法的引用,這個方法和第一步定義的簽名一致。
4.為委託物件增加其他方法。
5.像方法一樣呼叫委託。此時,委託持有的每一個方法都會依次執行。
宣告委託
public delegate void TestDelegate(int num);
1.宣告委託的語法與定義方法的語法類似,但沒有方法體,宣告的前面加關鍵字delegate。
2.宣告委託相當於聲明瞭一個新類,所以可以在任何宣告類的相同地方宣告委託。
3.可以在委託的宣告上應用任何常見的訪問修飾符,如public,private等。
建立委託物件
方式1:使用帶new運算子的物件建立表示式。
TestDelegate td1 = new TestDelegate(TestMethod);
方式2:使用方法名直接建立
TestDelegate td1 = TestMethod;
方法名可以來自任何類和結構,可以是例項方法,也可以是靜態方法,方法簽名必須和委託的簽名一致。
組合委託
新增:
A = B + C;
A += B;
移除:
A-= B;
如果委託為空之後呼叫會報空指標,如果新增兩個相同的委託,移除委託從列表的結尾移除查詢的到的第一個,如果移除的委託不存在,不會報錯。
帶返回值的委託呼叫
多個方法加減,只有最後一個方法的返回值起作用。如果需要總體生效需要宣告引數為ref。
呼叫列表中最後一個方法的返回值就是委託呼叫最終的返回值。
呼叫列表中其他所有方法的返回值都會被忽略(覆蓋)。
委託簽名中的引數列表不為空時,需要區分該引數是值型別還是引用型別。若為引用型別引數,該引數的值可能會根據呼叫列表中的一個和多個方法而發生改變。
多播委託
持有多個方法的引用的委託,稱為多播委託。
在呼叫多播委託時,如果呼叫列表中的某一個方法丟擲異常,整個迭代就會停止,該方法之後的所有方法將不會被呼叫。
Delegate類的GetInvocationList()方法,返回一個Delegate物件陣列,該陣列中的每個元素都是一個委託物件,該物件持有原多播委託呼叫列表中的一個方法。
delegate(int num) {
//方法體
};