C# 事件

193 阅读2分钟

介绍

事件是允许类或对象的某些状态发生改变时通知其它类或对象。在(#编程中,在客户端开发中,事件(Event)可以看作是用户的一系列操作,例如按下键盘的某个按键、单击界面上一个按钮或选择某个选项等,当事件发生时我们可以针对事件做出一系列的响应,例如显示一个界面、退出程序、记录日志等等。

事件需要在一个类中声明和触发,并通过委托与事件处理程序关联。

事件可以分为发布器和订阅器两个部分:

发布器类 是一个包含件和委托的类,事件和委托之同的联系也定义在这个类中,发布需类的对象可以触发事件,并使用委托通知其他的对象。

订阅器类 则是一个接收事件并提供事件处理程序的类,发布器类中的委托调用订阅器类中的方法(事件处理程序)。

有关事件我们需要注意:

  • 发布器才能触发事件,订阅器决定对事件作出何种响应;
  • 一个事件可以拥有多个订阅器,同时订阅器也可以处理来自多个发布器的事件;
  • 没有订阅器的事件永远也不会触发;
  • 事件通常用于定义针对用户的操作,例如单击某个按钮;
  • 如果事件拥有多个订阅器,当事件被触发时会同步调用所有的事件处理程序:
  • 在.NET类库中,事件基于 EventHandler委托和 EventArgs 基类。

声明事件

1.如果在一个类RecordClass中声明一个事件,首先需要该类中为该事件声明一个委托类型

public delegate void RecordHandler(object sender,RecordArgs e);//声明类托
//事件参数类
public class RecordArgs :EventArgs
{
    public RecordInfo Record { get;set;}
    public RecordArgs(RecordInfo r)
    {
        Record = r;
    }
}

其中RecordHandler是委托名,RecordArgs 是自定义事件参数类

2.然后使用event关键字声明事件。

public event RecordHandler Recorded; //声明事件Recoreded

调用事件

在发布器类中提供触发事件的方法

public void onRecorded()
{
    if(Recorded!=null)
    {
        RecordArgs arg=new RecordArgs(record);
        Recorded(this,arg);//触发事件
     }
}

订阅事件

在订阅器类RecordListClass中订阅事件,并提供事件相关的处理方法(事件处理程序),并与事件关联

public void AddRecord()
{
    Recordclass recordclass=new Recordclass();
    recordclass.Recorded+=Recordclass Recorded;//订阅事件
    rrecordclass.showPage();
}
//事件处理程序
private void Recordclass Recorded(object sender,RecordArgs e)
{
    RecordInfo re=e.Reocrd;
    if(re!=null)
    {
        recordList.Add(re);
        PrintList();
    }
}