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

技术图片

相关文章