C#的事件机制
/*
* 我已经在该例中把创建,发送,触发,处理事件的过程用一步步的步骤描述出来了,不过现在还是迷迷糊糊的,有不明白的地方请见谅.
*/
using System;
//命名空间
namespace testEventApp
{
/*第一步:创建一个委托*/
//定义委托Class2_Event_Handler
public delegate void Class2_Event_Handler(object sender, string strEventArg);
/// <summary>
/// Class1 的摘要说明。
/// </summary>
/*=======================================================================
事件接收方类
=======================================================================*/
//定义类Class1
class Class1
{
//创建类Class1的默认构造器
public Class1()
{
Console.WriteLine ("Class1>>>创建一个Class1对象!");
}
/*第四步:编写事件处理函数,该函数要具有与第一步中创建的委托相同的签名
*/
private void On_Class2Event(object sender, string strEventArg)
{ //Class2中事件发生时的处理函数
Console.WriteLine("Class1>>>收到Class2中的事件:" + strEventArg);
if (strEventArg == "exit")
{
Class2 senderRef = (Class2)sender;
//取消事件处理函数与Class2中事件的关联
senderRef.Class2_Event -= new Class2_Event_Handler(this.On_Class2Event);
Console.WriteLine("Class1>>>不再接收Class2的事件!输入exit退出!");
}
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Class1 aClass1 = new Class1 ();
Class2 aClass2 = new Class2 (); //创建一个Class2对象
/*第五步:将第四步中编写的事件处理函数与事件建立关联(也就是利用事件处理函数生成第一步中创建的委托的委托实例)
*/
//将事件处理函数与Class2中的事件关联
aClass2.Class2_Event += new Class2_Event_Handler(aClass1.On_Class2Event );
//调用Class2中的方法,等待其触发事件
aClass2.Class2_Event_Riser ();
}
}
/*=====================================================================
事件发送方类
=====================================================================*/
//定义类Class2
class Class2
{
/*定义类Class2的构造器*/
public Class2()
{
Console.WriteLine ("Class2>>>创建一个Class2对象!");
}
/*第二步:利用第一步中创建的委托创建事件,这样委托和时间之间就建立了关联(.NET类库中的很多事件都是已经订制好的,所以它们都有相应的
委托,在编写关联时间处理程序(也就是有事件发生时我们要执行的方法的时候)我们需要和这个委托相同的签名。*/
//利用delegate,定义一个事件
//在类中声明一个事件的格式: public event 委托名 事件名
public event Class2_Event_Handler Class2_Event;
/*第三步:创建可以触发事件的方法*/
//一个可以触发事件的方法
public void Class2_Event_Riser()
{
string strRead;
while(true)
{
Console.Write ("Class2>>>");
strRead = Console.ReadLine ();
if ( Class2_Event!=null )//当事件处理函数存在时
{
Console.WriteLine ("Class2>>>发送事件:"+strRead);
Class2_Event(this, strRead);//触发delegate中的事件处理函数
}
else if (strRead == "exit")
{
System.Environment .Exit (-1);
}
}
}
}
}