zoukankan      html  css  js  c++  java
  • 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后,会发现以下错误

  • 相关阅读:
    五)使用 easyui-tabs 遭遇错误 Unexpected Exception caught setting '_' on
    六)iframe 及父子页面之间获取元素、方法调用
    七)如何实现权限控制
    二)手动添加基础数据
    三)EasyUI layout
    四)绘树
    一)6张表
    RollingFileAppender
    GitLabCI VS Jenkins 对比
    Nacos 学习记录
  • 原文地址:https://www.cnblogs.com/mojiejushi/p/13190865.html
Copyright © 2011-2022 走看看