总结: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 subscribEvent23 {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 MouseLeftButton40 {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 else53 {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 subscribEvent20 {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 MouseLeftButton37 {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 else50 {51 Console.WriteLine("无订阅事件处理程序,未检测到点击相应按钮,点击无效!");52 }53 }54 55 public MouseLeftButton() {56 OnDoubleClick();57 }58 59 }
3、加上关键字event后,会发现以下错误