事件(复习)
相关概念:
触发(raise)事件:调用或触发事件的术语。当事件被触发时,所有注册到它的方法都会被依次调用。
发布者(publisher):让事件被其他类或结构可见并使用的类或结构。
订阅者(subscribert):把事件和发布者关联注册的类或结构。
事件处理程序(event handler):注册到事件的方法。可以在事件所在的类或结构中,或者在不同的类或结构中。
事件与委托的关系
Event关键字会为我们做了两件事:
1.创建好一个对应的private的委托对象。
2.创建了一个【事件属性】,里面包含了add和remove方法,他们都是直接操作上面的私有委托对象。
如下:
namespace 事件与委托的关系
{
class Program
{
static void Main(string[] args)
{
}
}
class MyHandler
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public event EventHandler MyEvent;
}
}
生成Exe文件后,在反编译器里查看:


总结:
1.事件提供了对它的私有控制委托的结构化访问(创建了对应的私有委托对象字段,同时为该属性创建了add和remove方法)
2.与委托中的其他操作不一样,对于事件我们只可以添加、删除或调用事件处理程序(这个只是相对于订阅者所言,事件发布者可以使用委托其他操作【原因1】)。
3.事件被触发时,它调用委托来依次调用列表中的方法
4.事件是成员: 不能使用对象创建表达式(new表达式)来创建它的对象。
必须声明在类或结构中,和其他成员一样;
事件成员被隐式自动初始化为Null.
委托类型与EventHandler
复习的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 事件与委托的关系
{
public delegate void MyDelegate();
/// <summary>
/// 订阅者类
/// </summary>
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入任意字符继续……");
Console.ReadKey();
MyHandler mh = new MyHandler();
//添加事件
mh.MyEvent += addMethod1;
mh.MyEvent += delegate { Console.WriteLine("你好,你调用了匿名方法"); };
mh.MyEvent += () => { Console.WriteLine("你好,你调用了Lamada方法"); };
mh.Test();
Console.Read();
}
private static void addMethod1()
{
Console.WriteLine("你好,你调用了addMethod1方法");
}
private static void addMethod2()
{
Console.WriteLine("你好,你调用了addMethod2方法");
}
private static void addMethod3()
{
Console.WriteLine("你好,你调用了addMethod3方法");
}
}
/// <summary>
/// 发布者类
/// </summary>
class MyHandler
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public event MyDelegate MyEvent;
/// <summary>
/// 触发事件的方法
/// </summary>
public void Test()
{
MyEvent();
}
}
}

浙公网安备 33010602011771号