相关概念:
触发(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(); } } }