C#事件
事件是C#语言内置的语法,可以定义和处理事件,为使用组件编程提供了良好的基础。
1 事件驱动
Windows应用程序和dos程序的最大不同是采用事件驱动方式工作,也叫消息驱动。dos程序如要从键盘输入数据,则要独占键盘等待用户输入,如用户不输入,则CPU一直执行键盘输入程序,等待用户输入,即dos程序独占外设和CPU。
Windows操作系统是一个多任务的操作系统,允许同时运行多个程序,它不允许任何一个程序独占外设,如键盘、鼠标等,所有运行程序共享外设和CPU,各个运行程序都要随时准备从外设接受命令,执行命令。因此必须由Windows操作系统统一管理各种外设。
Windows把用户对外设的动作都看作事件(消息),如单击鼠标左键,发送单击鼠标左键事件,用户按下键盘,发送键盘被按下的事件等。Windows操作系统统一负责管理所有的事件,根据具体情况把事件发送到相应运行程序,而各个运行程序自动用一个函数响应事件,这个函数叫事件处理函数。这种方法叫事件驱动。Windows操作系统在window.h文件中预定义了若干事件。在Form类和控件类中都定义了WndProc方法可截获Windows消息,这是一个虚函数。在它们的派生类中可重写WndProc方法,截获Windows消息,见下例,方法中Message是一个结构,m.Msg为事件编号,m.Wparam和m.LParam是事件的附加信息,事件不同,意义也不同。
protected override void WndProc(ref Message m)
{ base.WndProc(ref m);//调用基类事件处理函数
if(m.Msg==0x0112&&(int)m.WParam==0xf060) {…} //自定义处理事件代码
}
2 事件的声明
using System;
public delegate void ChangedEvent(object sender, EventArgs e); //代表类声明
public class Person
{ public event ChangedEvent Changed;//声明事件
private string P_name = "张三";//P_name是私有字段
public string Name //定义属性Name
{ get{ return P_name; }
set{ P_name = value; //修改了属性Name
OnChanged(EventArgs.Empty); }
}//希望属性Name被改变后,发出Changed事件
public virtual void OnChanged(EventArgs e)
{ if (Changed != null)//如果Changed代表了事件处理函数
Changed(this, e);//执行Changed代表的函数
}
}
public class Test
{ public static void Main()
{… } //代码见下节
static void OnePerson_Changed(object sender, EventArgs e)
{Console.WriteLine("修改了数据"); }
}
using System;
public delegate void ChangedEvent(object sender, EventArgs e); //代表类声明
public class Person
{ public event ChangedEvent Changed;//声明事件
private string P_name = "张三";//P_name是私有字段
public string Name //定义属性Name
{ get{ return P_name; }
set{ P_name = value; //修改了属性Name
OnChanged(EventArgs.Empty); }
}//希望属性Name被改变后,发出Changed事件
public static void Main()
{ Person OnePerson=new Person();//生成Person类对象
//下句令Changed代表程序员编制的事件处理函数OnePerson_Changed OnePerson.Changed +=new ChangedEvent(OnePerson_Changed);
String s = Console.ReadLine();
//改变Person类属性值,产生事件,调用事件处理函数
OnePerson.Name=s;
Console.ReadLine();//此句等待输入使能看到结果,回车退出
OnePerson.Changed -= new ChangedEvent(OnePerson_Changed);
}
运行该程序,输入若干字符后回车,修改Person类属性值,产生事件,调用事件处理函数,在下一行显示:修改了数据。
(参考资料:《C#应用程序设计教程》人民邮电出版社)