22、C#事件的定义与基本使用
1.事件的理解:
类包含三大类型(属性:存储数据,方法:做事情,事件:通知别的对象)
其实事件的一个设计思想就是一个发布订阅者模式,事件本质是对委托字段的一个包装器,类似于C#中字段和属性的关系,
要理解事件,我们先来了解事件的五个重要部分:
- 事件的拥有者:也就是声明了事件的对象或者类
- 事件本身(event,也叫事件源):是事件拥有者里的内容,是一种类型,是委托字段的包装器,对委托字段起限制作用,(一种特殊的委托类型,只能做+=和-=操作),事件和委托的关系就类似于C#中字段和属性的关系
- 事件的响应者(也叫订阅者):就是当事件触发时要做出响应的对象或者类
- 事件处理器:是事件响应者所包含的内容,当事件被触发时,事件的响应者会做出的操作,其实就是个回调方法
- 订阅:把事件处理器和事件关联在一起,本质上是一种以委托类型为基础的约定
2.事件发生的流程:
一个类或者对象里声明了事件,当事件发生的时候,所有的事件订阅者都会收到事件发生,还会收到事件参数,然后调用事件处理器;
internal class Program
{
static void Main(string[] args)
{
EventOwned owned = new EventOwned(); //事件拥有者
EventResponse response = new EventResponse(); //事件响应者
owned.MyEnvent += response.Action; //订阅事件
owned.EventTrigger(); //事件发生时,订阅事件的函数也会发生
Console.ReadLine();
}
}
/// <summary>
/// 我的事件参数类
/// </summary>
public class MyEventArgs : EventArgs
{
public string arg = null;
}
public delegate void MyEventHandler(object sender, MyEventArgs e);
/// <summary>
/// 事件拥有者类
/// </summary>
public class EventOwned
{
//声明事件有两种方式:
/* 一、完整的声明:
1.先声明委托
2.再声明事件
*/
private MyEventHandler myEventHandler;
/// <summary>
/// 事件本身
/// </summary>
public event MyEventHandler MyEnvent
{
add
{
this.myEventHandler += value;
}
remove
{
this.myEventHandler -= value;
}
}
//二、简单声明:其实是一个C#的一个语法糖,自动生成了委托字段,事件是委托字段的包装器
//public event MyEventHandler MyEnvent;
/// <summary>
/// 事件触发方法
/// </summary>
public void EventTrigger()
{
//如果绑定(订阅)了事件
if (this.myEventHandler != null)
{
//调用事件
myEventHandler(this, new MyEventArgs { arg = "参数" });
}
}
}
/// <summary>
/// 事件响应类
/// </summary>
public class EventResponse
{
/// <summary>
/// 事件处理器
/// </summary>
/// <param name="sender">事件拥有者对象</param>
/// <param name="e"></param>
internal void Action(object sender, EventArgs e)
{
MyEventArgs args = e as MyEventArgs;
Console.WriteLine(sender.GetType());
Console.WriteLine("事件处理器运行");
}
}
值得注意的是:在别的类中不能直接调用事件,只能通过定义事件类的方法来间接的调用事件。