1. 程式人生 > >[C#-1] C#中event的關鍵字存在的意義

[C#-1] C#中event的關鍵字存在的意義

C#中事件是基於委託。

不使用event關鍵字定義委託例項物件:

  1. //定義一委託型別
  2. publicdelegatevoid MyButtonEventHandler(string msg);  
  3. //定義MyButton類,模擬按鈕物件
  4. publicclass MyButton  
  5. {  
  6.     //定義一委託例項
  7.     public MyButtonEventHandler Click;  
  8.     privatestring msg;  
  9.     /// <summary>
  10.     /// 用於觸發Click事件(模擬點選按鈕)
  11.     /// </summary>
  12.     public
    void OnClick()  
  13.     {  
  14.         if (Click != null)  
  15.         {  
  16.             Click("我點選了:" + msg);  
  17.         }  
  18.     }  
  19.     //建構函式
  20.     public MyButton(string msg)  
  21.     {  
  22.         this.msg = msg;  
  23.     }  
  24. }  
  1. MyButton mb = new MyButton("MyButton物件");  
  2. //指定點選按鈕後的處理方法
  3. mb.Click += MyButton_Click;  
  4. /* * * * * * * * * * * * * * * * * * * * * * * * 
  5. 注意: 
  6. 作為一個按鈕,本身正常的業務邏輯是:點選按鈕後,執行響應處理方法 
  7. 但由於mb.Click沒有使用event關鍵字,只作為一公開普通委託例項物件 
  8. 因此無需點選,就可任意執行處理方法,這顯然不是我們所期望的^-^ 
  9. * * * * * * * * * * * * * * * * * * * * * * * * */
  10. mb.Click("Click為公共委託物件,可任意觸發執行委託方法,而無需觸發OnClick方法");  
  11. //點選按鈕觸發委託方法
  12. //mb.OnClick();
  13. //響應處理方法
  14. private
    void MyButton_Click(string msg)  
  15. {  
  16.     Response.Write(msg);  
  17. }  

使用event關鍵字:

  1. //定義一委託型別
  2. publicdelegatevoid MyButtonEventHandler(string msg);  
  3. publicclass MyButton  
  4. {  
  5.     //定義一委託例項(事件)
  6.     publicevent MyButtonEventHandler Click;  
  7.     privatestring msg;  
  8.     /// <summary>
  9.     /// 用於觸發Click事件(模擬點選按鈕)
  10.     /// </summary>
  11.     publicvoid OnClick()  
  12.     {  
  13.         if (Click != null)  
  14.         {  
  15.             Click("我點選了:" + msg);  
  16.         }  
  17.     }  
  18.     //建構函式
  19.     public MyButton(string msg)  
  20.     {  
  21.         this.msg = msg;  
  22.     }  
  23. }  
  1. MyButton mb = new MyButton("MyButton物件");  
  2. mb.Click += MyButton_Click;  
  3. //以下報錯
  4. //mb.Click("Click為雖公共委託物件,但不可隨意執行委託方法,因為有event關鍵字修飾!");
  5. //點選按鈕後才觸發委託方法(保證只有MyButton物件才可觸發該事件)
  6. mb.OnClick();