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