C#委託和事件
阿新 • • 發佈:2022-02-19
首先說明
(1)C#中事件:事件時屬於類的成員,所以要放在類的內部。
(2)委託屬於一個定義,是和類、介面類似的,通常放在外部。
(因為大多數委託都要被重用)
委託定義在類裡面還是類外面視情況而定,一般定義在與類定義平級部分,
且用public修飾,便於外部呼叫。
若定義在類的內部,則必須通過呼叫該類的成員才能取得其委託的引用,
頻繁呼叫的情況下不合適。
委託定義在類內部,舉例說明如下:
委託定義在類內部,舉例說明如下:
Class A { //宣告在這裡是可以的~ private delegate void test_del(int a); private void test(){...} publicvoid start(){ //宣告在這裡就不行了~ private delegate void test_del(int a); } }
委託是一種特殊的類,和普通類不同的是委託是對一類方法的抽象。
因此只能在類內部定義內部類(包括委託、結構和列舉)而不能在方法中定義委託是事件的基礎,事件又對委託進行了封裝。
大致來說,委託是一個類,該類內部維護著一個欄位,指向一個方法。事件可以被看作一個委託型別的變數,通過事件註冊、取消多個委託或方法。
在Winform和以前的WebForm中,事件被大量使用,是必須掌握的知識(但MVC不是事件驅動的),一個完整的事件流程包括:
在類裡面定義一個委託,宣告事件用於釋出,
public class Button { //定義事件,用於釋出 public event EventHandler OnClick; //注意:EventHnadler是一個委託 public void click() { if (OnClick != null) { OnClick(this, new EventArgs()); } } }
例項化一個釋出了OnClick事件的button。事件被btn_click訂閱,即:當這個btn被click時呼叫btn_click()方法
//例項化一個釋出了OnClick事件的button Button btn = new Button(); //事件被btn_click訂閱,即:當這個btn被click時呼叫btn_click()方法 btn.OnClick += btn_click;
寫一個靜態方法
private static void btn_click(object sender, EventArgs e) { Console.WriteLine("1111111"); }
觸發事件
//事件被觸發 btn.click();
注意:
event和delegate都可以被多次訂閱(+=)/退訂(-=)
總結:
○ 委託就是一個類,也可以例項化,通過委託的建構函式來把方法賦值給委託例項
○ 事件可以看作是一個委託型別的變數
○ 通過+=為事件註冊多個委託例項或多個方法
○ 通過-=為事件登出多個委託例項或多個方法
○ EventHandler就是一個委託
文章轉載自:軟體開發平臺
地址:https://www.hocode.com/