一、什么是事件?
在C#中,事件(event)是一种特殊的类成员,它允许类或对象通知其他类或对象发生了某些事情。
从语法上看,事件的声明类似于字段,但它们在功能和行为上有一些重要的区别。
从技术角度来说,事件实际上是一个封装了事件订阅和取消订阅功能的委托字段。当声明一个事件时,编译器会在背后生成一个私有的委托字段,以及公共的添加(add)和移除(remove)访问器方法。
例如事件声明时:
public event EventHandler<TextArgs> TextPublish;
编译器实际上会生成类似如下的代码:
private EventHandler<TextArgs> _textPublish;
public event EventHandler<TextArgs> TextPublish
{
add { _textPublish += value; }
remove { _textPublish -= value; }
}
这里,_textPublish是一个私有的委托字段,它存储了所有订阅了TextPublish事件的事件处理方法。add和remove访问器方法提供了订阅和取消订阅事件的功能,它们分别对应了+=和-=操作符。
所以,从这个角度来看,事件更像是一个特殊的属性(property),它封装了一个私有的委托字段,并提供了特定的访问方法。
但是,与普通的属性不同,事件有一些特殊的限制:
1. 事件只能在声明它的类内部直接调用。在类外部,只能通过+=和-=操作符来订阅和取消订阅事件,不能直接读取或赋值事件。
2. 事件通常应该是公共的(public),以允许其他类订阅和取消订阅。但是,事件的访问器方法(add和remove)通常应该是私有的或受保护的,以防止在类外部直接调用。
3. 事件通常应该在引发事件的类中声明,而事件处理方法通常应该在订阅事件的类中定义。这体现了事件的发布-订阅模型。
所以,事件是一种特殊的类成员,它结合了字段、属性和方法的某些特性,用于实现事件驱动编程。理解事件的特殊性质,对于正确地使用和管理事件非常重要。
二、实例说明
举例:在Form1与Form2中有button1和textbox1。
点击Form1中的button1显示Form2。点击Form2中的button1,将Form2中textbox1中的内容发送到Form1中的textbox1中去。
设计,用事件来处理。在Form2声明事件变量,实行触发与发布。在Form2中进行事件处理与事件订阅。
form2中:
public partial class Form2 : Form
{
public event EventHandler<Te