事件(C# 与 Java)
更新:2007 年 11 月
事件是当对象发生用户关心的情况(如单击图形用户界面上的控件)时,类将此对象通知用户的方法。这种通知即称为“引发事件”。引发事件的对象称为事件的源或发送方。
与 Java 中的事件处理(通过实现自定义侦听器类执行)不同,C# 开发人员可以使用委托进行事件处理。委托是一种封装方法的类型。一旦使用方法初始化委托后,委托的行为方式就与该方法完全相同,且可以使用 () 运算符调用。它与 C++ 函数指针类似,但它是类型安全的。
委托与其他任何方法的使用方法类似,也有参数(可能有多个)和返回值(仅一个),如下面的示例所示:
public delegate int ReturnResult(int x, int y);
有关委托的更多信息,请参见 委托(C# 编程指南)。
事件和方法一样具有签名,签名包括名称和参数列表。事件的签名通过委托类型来定义,例如:
public delegate void MyEventHandler(object sender, System.EventArgs e);
在 Windows 用户界面编程中,通常使第一个参数作为引用事件源的对象,使第二个参数作为携带与事件相关的数据的对象。但是,在 C# 语言中并不强制使用这种形式;只要事件签名返回 void,其他方面可以与任何有效的委托签名一样。
事件可以使用 event 关键字进行声明,如下例所示:
public event MyEventHandler TriggerIt;
若要触发该事件,请定义引发该事件时要调用的方法,如下例所示:
public void Trigger()
{
TriggerIt();
}
若要引发事件,可以调用委托,并传递与该事件相关的参数。然后,该委托将调用已添加到该事件中的所有处理程序。每个事件都可以分配多个处理程序来接收该事件。在这种情况下,该事件将自动调用每个接收方。无论有多少个接收方,引发一个事件都只需调用一次该事件。
如果希望某个类接收事件,请通过使用 += 运算符向该事件添加委托来订阅该事件,例如:
myEvent.TriggerIt += myEvent.MyMethod;
若要取消预订事件,请使用 -= 运算符将委托从事件中移除,例如:
myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);
有关事件的更多信息,请参见 事件(C# 编程指南)。
说明: |
---|
在 C# 2.0 中,委托既可以封装命名方法,也可以封装匿名方法。有关匿名方法的更多信息,请参见 匿名方法(C# 编程指南)。 |
示例
说明
下面的示例定义了一个具有三个关联方法的事件。触发此事件时,将执行这些方法。接着,从此事件移除一个方法,再次触发此事件。
代码
// Declare the delegate handler for the event:
public delegate void MyEventHandler();
class TestEvent
{
// Declare the event implemented by MyEventHandler.
public event MyEventHandler TriggerIt;
// Declare a method that triggers the event:
public void Trigger()
{
TriggerIt();
}
// Declare the methods that will be associated with the TriggerIt event.
public void MyMethod1()
{
System.Console.WriteLine("Hello!");
}
public void MyMethod2()
{
System.Console.WriteLine("Hello again!");
}
public void MyMethod3()
{
System.Console.WriteLine("Good-bye!");
}
static void Main()
{
// Create an instance of the TestEvent class.
TestEvent myEvent = new TestEvent();
// Subscribe to the event by associating the handlers with the events:
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
// Trigger the event:
myEvent.Trigger();
// Unsuscribe from the the event by removing the handler from the event:
myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
System.Console.WriteLine("\"Hello again!\" unsubscribed from the event.");
// Trigger the new event:
myEvent.Trigger();
}
}
输出
Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!