一、委托
使用委托時要先實例化,和類一樣,使用new關鍵字產生委托的新實例,然后將一個或者多個與委托簽名匹配的方法與委托實例關聯。隨后調用委托時,就會調用所有與委托實例關聯的方法。
與委托關聯可以是任何類或者結構中的方法,可以是靜態方法,只要是可以訪問的方法都可以。
1.創建一個委托類型使用關鍵字delegate(委托)
輸出如下:
2.一個委托實例,可關聯多個方法:
其中D4 = TestMethod1;用“=”而不能“+=”,是因為之前D4未實例化,可以使用下面的代碼:
MyDelegate D4 = new MyDelegate(TestMethod1); D4 += TestMethod2; D4 += TestMethod3;
但是如果使用以下方式,會出現編譯錯誤: “MyDelegate”方法沒有采用“0”個參數的重載:
MyDelegate D4 = new MyDelegate(); D4 += TestMethod1;
詳情見:http://www.tracefact.net/tech/009.html
3.移除一個委托實例中的方法 使用“-=”:
二、事件
事件自身就是委托類型,由於委托可以綁定和調用多個方法,所以會為事件的處理帶來方便。類型只需要對外公開事件,就可以與外部的其它地方關聯,從而實現事件訂閱
要在類中聲明事件(只不過不管是不是聲明為public,它總是被聲明為private。另外,它還有兩個方法,分別是add_MakeGreet和remove_MakeGreet,這兩個方法分
別用於注冊委托類型的方法和取消注冊。實際上也就是: “+= ”對應 add_MakeGreet,“-=”對應remove_MakeGreet。而這兩個方法的訪問限制取決於聲明事件時的訪問限制符。)
1.首先要定義用來作為事件封裝類型的委托,用event關鍵字來聲明事件。
2.為了允許派生類重寫引發事件的代碼,通常會在類中聲明一個受保護的方法,習慣上命名On<事件名>
3.EventArgs類參數
由於不同的事件要傳遞的參數不同,更多時候是從EventArgs類派生的子類的實例,顯然EventHandler委托時不能滿足各種情況的。
如果針對不同的事件也定義一個對應的委托,數量一旦多起來,不好管理,為了解決這個問題,.NET類庫提供了一個帶有泛型參數的事件
處理委托:
public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e); TEventArgs 是一個泛型參數