事件

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

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

  在典型的 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

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

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

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

  
原文地址:https://www.cnblogs.com/abcdwxc/p/1575527.html