zoukankan      html  css  js  c++  java
  • 事件

    首先,先看看微软对事件的说明:

      类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为发行者,接收(或处理)事件的类称为订户

      在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表框)引发的事件。可使用 Visual C# 集成开发环境 (IDE) 来浏览控件发布的事件,选择要处理的事件。IDE 会自动添加空事件处理程序方法和订阅事件的代码。

    事件具有以下特点:

    ·         发行者确定何时引发事件,订户确定执行何种操作来响应该事件。

    ·         一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。

    ·         没有订户的事件永远也不会引发。

    ·         事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。

    ·         如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法

    ·         可以利用事件同步线程。

    ·         .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。

    实例如下:

        首先我们先定义一个发行者Pulisher,其中定义了事件Add及触发事件的方法ExecuteAdd

     public class Pulisher
        {
            
    //定义事件
            public event AddEventHandler Add;        
            
    //触发事件的发法
            public void ExecuteAdd(int a, int b)
            {
                
    if (Add != null)
                    
    //// 触发事件
                    Add(a, b);
                Console.Read();
            }
    }

    注意: 事件应该由事件发布者触发.

    其次,我们定义二个订户Subscriber1Subscriber2,为其分别定义事件的处理程序OnAddOnExtraAdd.

    public class Subscriber1
        {
            
    //事件的处理程序
            public void OnAdd(int a, int b)
            {
            Console.WriteLine((a 
    + b).ToString());
            }       
        }
    public class Subscriber2
        {
            
    //事件的处理程序     
            public void OnExtraAdd(int a, int b)
            {
                Console.WriteLine((a 
    + b + 5).ToString());
            }
        }

      
    static void Main(string[] args)
        {
      Pulisher p 
    = new Pulisher();
                Subscriber1 s 
    = new Subscriber1();
    Subscriber2 s 
    = new Subscriber2();
                
    //给事件注册处理的程序
                p.Add += new AddEventHandler(s1.OnAdd);
                p.Add 
    += new AddEventHandler(s2.OnExtraAdd);
                
    //调用事件
                p.ExecuteAdd(35);
                
    //给事件注销处理的程序
                p.Add -= new AddEventHandler(s1.OnAdd);
               //调用事件
              p.ExecuteAdd(35);
    }


    运行结果:

      8

     13

     13


    我们看一下,反编译后的程序,我们发现我们定义的  public event AddEventHandler Add;  反编译后却成了私有的。                                             


        其实在类的内部,不管你声明它是public还是protected,它总是private的。

    另外,它还有两个方法,分别是add_Addremove_Add,这两个方法分别用于注册委托类型的方法和取消注册。实际上也就是: “+= ”对应 add_Add“-=”对应remove_Add

    到此,我们用事件也完成了委托一节所完成的功能。事件和委托是如此的相似,到底是什么关系呢?

    我们看看事件做了什么事件,其实其作用相当于充当了封装了委托实例而已。事件就是封装了委托实例的委托。另外,委托可以第一次绑定方法时用=,下来可以用=及+=,而事件必须用+=绑定执行的处理程序。

    以上是我的个人理解,如有不对,欢迎指正。

      
  • 相关阅读:
    配置samba
    extern c
    剑指offer 孩子们的游戏
    剑指offer 扑克牌顺子
    剑指offer 翻转单词顺序列
    剑指offer 左旋转字符串
    mysql查看或显示当前存在多少数据库
    vim替换
    平衡二叉树
    将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
  • 原文地址:https://www.cnblogs.com/abcdwxc/p/1575527.html
Copyright © 2011-2022 走看看