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后,会发现以下错误

C# 之事件及event关键字存在的意义

C# 之事件及event关键字存在的意义

上一篇:Win10 家庭中文版安装Docker(Win10家庭版 +Hyper-V+Docker)


下一篇:C# 委托Action和Func