事件与事件处理程序
事件与时间处理程序
事件是可以被控件识别的操作。如按下确定按钮,选择某个单选按钮或者复选框。每一种控件有自己可以识别的事件,如窗体的加载、单击、双击等事件,编辑框(文本框)的文本改变事件,等等。
事件有系统事件和用户事件。
1.系统事件由系统激发,如时间间隔24小时,银行储蓄的存款日期增加一天。
2.用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。事件驱动控件执行某项功能。
触发事件的对象称为事件发送者;接收事件的对象称为事件接受者;
事件是用户对窗口上各种组件的操作。使用事件机制可以实现:当类对象的状态发生变化时,系统会通过某种途径调用类中的有关处理这个事件的方法或者触发控件的事件处理程序等。
在.NET框架中,事件是将事件发送这(触发事件的对象)与事件接受者(处理事件的方法)相关联的一种代理类,即事件机制是通过代理类来实现的。当一个事件被触发时,由该代理来通知(调用)处理事件的相应方法。
C#中事件机制的工作过程如下:
(1) 将实际应用中需要通过事件机制解决的问题对象注册到相应的事件处理程序上,代表今后当该对象的状态改变时,该对象有权使用它注册的事件处理程序。
(2) 当事件发生时,触发事件的对象就会调用该对象所有已注册的事件处理程序。
下面就以一个具体的例子来说明事件与事件处理程序:
using System;
namespace Sample
{
public class Program
{
//事件处理程序
private static double Add(double first, double second)
{
return first + second;
}
static void Main(string[] args)
{
Sample sample=new Sample();
sample.Calculate += new Sample.CalculateHandler(Add); //添加事件处理程序
double a = Convert.ToDouble(Console.ReadLine());
double b = Convert.ToDouble(Console.ReadLine());
sample.InvokeEvent(a, b); //触发事件
Console.ReadKey();
}
}
public class Sample
{
public delegate double CalculateHandler(double first, double b);
public event CalculateHandler Calculate; //事件
public void InvokeEvent(double a,double b)
{
Console.WriteLine(Calculate(a, b));
}
}
}
首先,申明一个类 Sample ,包含成员 CalculateHandler(委托)与Calculate(事件)(在C#中,事件是通过委托定义的,及申明事件,要先确定事件处理程序的函数签名,然后确定委托类型,在通过委托定义事件。)函数 InvokeEvent()用于激发事件,以执行事件处理程序。在本例中事件只有一个事件处理程序。下面是一个事件订阅多个事件处理程序的代码:
using System;
namespace Sample
{
public class Program
{
//事件处理程序
private static void Add(double first, double second)
{
Console.WriteLine(first + second);
}
//事件处理程序
private static void Sub(double first, double second)
{
Console.WriteLine(first - second);
}
//事件处理程序
private static void Div(double first, double second)
{
Console.WriteLine(first / second);
}
//事件处理程序
private static void Mul(double first, double second)
{
Console.WriteLine(first * second);
}
static void Main(string[] args)
{
Sample sample=new Sample();
sample.Calculate += new Sample.CalculateHandler(Add); //添加事件处理程序
sample.Calculate += new Sample.CalculateHandler(Sub); //添加事件处理程序
sample.Calculate += new Sample.CalculateHandler(Mul); //添加事件处理程序
sample.Calculate += new Sample.CalculateHandler(Div); //添加事件处理程序
double a = Convert.ToDouble(Console.ReadLine());
double b = Convert.ToDouble(Console.ReadLine());
sample.InvokeEvent(a, b); //触发事件
Console.ReadKey();
}
}
public class Sample
{
public delegate void CalculateHandler(double first, double b);
public event CalculateHandler Calculate;
public void InvokeEvent(double a,double b)
{
Calculate.Invoke(a, b);
}
}
}
在这个例子中 Calculate 事件订阅了四个事件(加,减,乘,除),在触发 Calculate 事件后,按顺序依次执行四个事件处理程序。
事件与事件处理程序是不同的概念,只有当事件先订阅(添加)事件处理程序后,在触发事件时,事件才会依次(按订阅的先后)处理所有订阅的事件处理程序。所以我们在写程序时所说的事件通常指的是事件处理程序(即我们习惯将所写的事件处理程序添加到事件上的过程叫做事件),但在自定义事件中,事件就是指的事件,应当正确的理解这两者的区别。