事件的声明和使用与代理有很密切的关系,事件其实是一个或多个方法的代理,当对象的某个状态发生了变化,代理会被自动调用,从而代理的方法就被自动执行。
声明和使用一个事件需要如下步骤:
1.创建一个代理。
2.在类的内部利用event关键字声明事件,并且在类中定义调用事件的方法,也可以定义一个处理事件消息的方法。
声明一个事件的基本形式有两种:
修饰符 event 类型 标识符
修饰符 event 类型 标识符{get{};set{};}
其中:
修饰符是指C#语言的访问修饰符;类型是在声明使用事件的第一步中创建的代理;标识符是一个C#语言的合法标识符,这个标识符被用来在程序中唯一确定声明的事件;在声明事件的第二种形式中具有和类的属性类似的get和set部分,事件的get和set部分意义、使用方法均与属性类似。
3.声明若干个方法与事件关联。将事件同方法进行关联的过程类似于代理对象引用方法的过程。这些方法就是用来处理事件的方法。
4.最后,在程序中使用事件。使用事件需要根据事件的定义或者直接调用事件已经定义好的调用事件的方法,或者通过系统消息来自动触发事件。
用一个例子来说明事件的使用。
创建一个简单的类,名为FileWatch,包含事件OnfileChange。该类将检查在执行应用程序的目录(当前目录,通常是项目名/bin/debug)下,是否存在文件test.txt。如果文件被删除或创建,都将触发事件。同时提供一个方法MonitorFile以不断地查询该文件。
方法:
在创建一个可用事件之前,首先声明一个委托,放在类的外面。
接下来创建类FileWatch。然后声明事件,注意事件的类型即为我们之前定义的委托。
现在创建方法OnFileChange(),当调用该方法时将触发事件:
{
if (FileWatchEvent!=null)
{
FileWatchEvent(this,e);
}
}</div>
最后,创建方法MonitorFile(),
{
bool bCurrentStatus;
while(true)
{
bCurrentStatus = File.Exists("test.txt");
if (bCurrentStatus != _bLastStatus) //_bLastStatus为私有字段,初始值为false;
{
_bLastStatus = bCurrentStatus;
OnFileChange(EventArgs.Empty);
}
Thread.Sleep(250);
}
}</div>
完整代码如下:
using System.Threading;
using System.IO;
namespace Sample.Event
{
public delegate void FileWatchEventHandler(object sender, EventArgs e);
public class FileWatch
{
private bool _bLastStatus = false;
public FileWatch()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public event FileWatchEventHandler FileWatchEvent;
protected virtual void OnFileChange(EventArgs e)
{
if (FileWatchEvent != null)
{
FileWatchEvent(this, e);
}
}
public void MonitorFile()
{
bool bCurrentStatus;
while(true)
{
bCurrentStatus = File.Exists("test.txt");
//状态不符,说明文件被删除或重新创建,此时触发事件;
if ( bCurrentStatus != _bLastStatus )
{
_bLastStatus = bCurrentStatus;
OnFileChange( EventArgs.Empty );