msdn
类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。
事件具有以下特点:
-
发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
-
一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。
-
没有订户的事件永远也不会引发。
-
事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。
-
如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
-
可以利用事件同步线程。
-
在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。
以编程方式订阅事件
-
定义一个事件处理程序方法,其签名与该事件的委托签名匹配。例如,如果事件基于 EventHandler 委托类型,则下面的代码表示方法存根:
-
使用加法赋值运算符 (+=) 来为事件附加事件处理程序。在下面的示例中,假设名为 publisher 的对象拥有一个名为 RaiseCustomEvent 的事件。请注意,订户类需要引用发行者类才能订阅其事件。
publisher.RaiseCustomEvent += HandleCustomEvent;
请注意,前面的语法是 C# 2.0 中的新语法。此语法完全等效于必须使用 new 关键字显式创建封装委托的 C# 1.0 语法:
还可以通过使用 lambda 表达式添加事件处理程序:
public Form1() { InitializeComponent(); // Use a lambda expression to define an event handler. this.Click += (s,e) => { MessageBox.Show( ((MouseEventArgs)e).Location.ToString());}; }
要防止在引发事件时调用事件处理程序,请取消订阅该事件。要防止资源泄露,应在释放订户对象之前取消订阅事件。在取消订阅事件之前,在发布对象中作为该事件的基础的多路广播委托会引用封装了订户的事件处理程序的委托。只要发布对象保持该引用,垃圾回收功能就不会删除订户对象。
使用减法赋值运算符 (-=) 取消订阅事件
事件概述
事件就是当对象或类状态发生改变时,对象或类发出的信息或通知。发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它
并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.在C#中事件使用委托来为触发时将调用的方法提供类型安全的封装!
eg:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplicationevent
{
//充当事件的订阅者
class Program
{
static void Main(string[] args)
{
MyText myText = new MyText();
// 将事件处理程序添加到事件的调用列表中(即事件布线)
myText.Changed += new MyText.ChangedEventHandler(myText_Changed);
string str = "";
while (str != "quit")
{
Console.WriteLine("please enter a string:");
str = Console.ReadLine();
myText.Text = str;
}//endwhile
}//endmain
// 对Change事件处理的程序
private static void myText_Changed(object sender, EventArgs e)
{
Console.WriteLine("text has been changed :{0}/n", ((MyText)sender).Text);
}
}//endProgram
//充当事件的发送者
public class MyText
{
private string _text = "";
// 定义事件的委托
public delegate void ChangedEventHandler(object sender, EventArgs e);
// 定义一个事件
public event ChangedEventHandler Changed;
// 用以触发Change事件
protected virtual void OnChanged(EventArgs e)
{
if (this.Changed != null)
this.Changed(this, e);
}
// Text属性
public string Text
{
get { return this._text; }
set
{
this._text = value;
// 文本改变时触发Change事件
this.OnChanged(new EventArgs());
}
}
}
}