事件(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!

请参见

概念

C# 编程指南

参考

event(C# 参考)

委托(C# 参考)

其他资源

C#(针对 Java 开发人员)