1. 程式人生 > 其它 >C#委託和事件

C#委託和事件

首先說明 (1)C#中事件:事件時屬於類的成員,所以要放在類的內部。 (2)委託屬於一個定義,是和類、介面類似的,通常放在外部。 (因為大多數委託都要被重用) 委託定義在類裡面還是類外面視情況而定,一般定義在與類定義平級部分, 且用public修飾,便於外部呼叫。 若定義在類的內部,則必須通過呼叫該類的成員才能取得其委託的引用, 頻繁呼叫的情況下不合適。
委託定義在類內部,舉例說明如下:
Class A {
  //宣告在這裡是可以的~
  private delegate void test_del(int a);
  
  private void test(){...}
  public
void 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/