C# 之事件及event關鍵字存在的意義


總結:event關鍵字的作用,用於不公開發布器中委托對象實例,對事件委托對象進行保護,禁止外部調用。

1、C#事件舉例說明

 1 //事件及event關鍵字存在的意義
 2     class Program
 3     {
 4         //事件,發布(publisher)-訂閱(subscriber)模型
 5         static void Main(string[] args)
 6         {
 7             MouseLeftButton e = new MouseLeftButton(); /* 實例化對象,第一次沒有觸發事件 */
 8             subscribEvent v = new subscribEvent(); /* 實例化對象 */
 9             e.clickHandler += v.clickChromeBrowserIcon; /* 注冊 訂閱雙擊點擊瀏覽器圖標 */
10             //e.OnDoubleClick();
11             //e.clickHandler -= v.clickChromeBrowserIcon;
12             e.OnDoubleClick();
13             e.clickHandler += v.clickWeChatIcon;
14             Console.WriteLine("我手速比較快,同時點擊了瀏覽器標簽和微信標簽");
15             e.OnDoubleClick();
16 
17         }
18     }
19 
20     
21     //事件訂閱器類,提供事件處理程序的對象,就是事件發生了要做什么事情。
22     public class subscribEvent
23     {
24         //點擊谷歌瀏覽器圖標
25         public void clickChromeBrowserIcon()
26         {
27             Console.WriteLine("瀏覽器打開,我輸入了博客園網址打開了博客園網站首頁!");
28         }
29 
30         //點擊桌面微信圖標
31         public void clickWeChatIcon()
32         {
33             Console.WriteLine("微信客戶端打開,我登錄了我的微信!");
34         }
35     }
36 
37     //事件發布器類,用於發布事件,包含事件和委托定義的對象。
38     //定義MouseLeftButton類,模擬鼠標左鍵對象
39     public class MouseLeftButton
40     {
41         //聲明一個鼠標點擊委托
42         public delegate void ClickHandler();
43 
44         public event ClickHandler clickHandler;
45 
46         public void OnDoubleClick()
47         {
48             if (clickHandler != null)
49             {
50                 clickHandler(); /* 事件被觸發 */
51             }
52             else
53             {
54                 Console.WriteLine("無訂閱事件處理程序,未檢測到點擊相應按鈕,點擊無效!");
55             }
56         }
57 
58         public MouseLeftButton() {
59             OnDoubleClick();
60         }
61 
62     }

2、去掉event關鍵字不要,程序也能正常執行。但是,這是發布器類的委托失去了保護,可以觸發任何可能的操作。

 1   //事件及even關鍵字存在的意義
 2     class Program
 3     {
 4         //事件,發布(publisher)-訂閱(subscriber)模型
 5         static void Main(string[] args)
 6         {
 7             MouseLeftButton e = new MouseLeftButton(); /* 實例化對象,第一次沒有觸發事件 */
 8             subscribEvent v = new subscribEvent(); /* 實例化對象 */
 9             e.clickHandler += v.clickChromeBrowserIcon; /* 注冊 訂閱雙擊點擊瀏覽器圖標 */
10             e.clickHandler += v.clickWeChatIcon;
11             Console.WriteLine("我的電腦不受控制了,沒有點擊也打開了瀏覽器和微信!");
12             e.clickHandler();//可以直接調用了委托
13 
14         }
15     }
16 
17     
18     //事件訂閱器類,提供事件處理程序的對象,就是事件發生了要做什么事情。
19     public class subscribEvent
20     {
21         //點擊谷歌瀏覽器圖標
22         public void clickChromeBrowserIcon()
23         {
24             Console.WriteLine("瀏覽器打開,我輸入了博客園網址打開了博客園網站首頁!");
25         }
26 
27         //點擊桌面微信圖標
28         public void clickWeChatIcon()
29         {
30             Console.WriteLine("微信客戶端打開,我登錄了我的微信!");
31         }
32     }
33 
34     //事件發布器類,用於發布事件,包含事件和委托定義的對象。
35     //定義MouseLeftButton類,模擬鼠標左鍵對象
36     public class MouseLeftButton
37     {
38         //聲明一個鼠標點擊委托
39         public delegate void ClickHandler();
40 
41         public ClickHandler clickHandler;
42 
43         public void OnDoubleClick()
44         {
45             if (clickHandler != null)
46             {
47                 clickHandler(); /* 事件被觸發 */
48             }
49             else
50             {
51                 Console.WriteLine("無訂閱事件處理程序,未檢測到點擊相應按鈕,點擊無效!");
52             }
53         }
54 
55         public MouseLeftButton() {
56             OnDoubleClick();
57         }
58 
59     }

3、加上關鍵字event后,會發現以下錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM