event(C++ 组件扩展)
event关键字声明事件,这是向已注册订阅服务器的通知 (事件处理程序) 感兴趣的事情发生了。
所有的运行库
C + + /cli CX 支持声明事件成员 或 事件块。 事件成员是声明一个事件块的简写。 默认情况下声明事件成员add(), remove(),和raise()事件块中显式声明的函数。 要自定义事件成员中的函数,而是声明一个事件块,然后重写的函数所需的。
语法
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
参数
修饰符
可以使用事件声明或事件访问器方法的修饰符。 可能的值为 static 和 virtual。委托
委托,该事件处理程序必须匹配的签名。event_name
事件的名称。return_value
事件访问器方法的返回值。 返回类型必须是为了通过验证, void。参数
(可选)参数raise方法的签名匹配的委托参数。
备注
事件是委托和触发的事件作出响应,并允许从任何类客户端注册方法符合签名,并且基础委托的返回类型的成员函数 (事件处理程序) 之间的关联。
有两种类型的事件声明:
事件数据成员
编译器会自动创建存储事件的委托类型的成员的窗体中,创建内部add(), remove(),和raise()成员函数。 必须在类内声明事件的数据成员。 委托的返回类型的返回类型必须与该事件处理程序的返回类型相匹配。事件块
事件块,可以显式声明和自定义行为的add(), remove(),和raise()的方法。
您可以使用operators+=和operator-=添加和移除事件处理程序或调用add()和remove()方法明确。
event一个上下文相关的关键字。 请参阅上下文相关的关键字(C++ 组件扩展)的详细信息。
Windows 运行时
备注
您可以添加和删除事件 ; 只有一个事件处理程序 不是多个事件处理程序。
如果您要添加和删除事件处理程序,您必须保存添加操作返回的 EventRegistrationToken 结构。 然后在删除操作中,必须使用已保存的 EventRegistrationToken 结构以标识要删除的事件处理程序。
要求
编译器选项:/ZW
公共语言运行时
event关键字可以声明一个事件。 事件是能够提供您感兴趣的事情时通知类的一种方式发生。
语法
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
参数
修饰符
可以使用事件声明或事件访问器方法的修饰符。 可能的值为 static 和 virtual。委托
委托,该事件处理程序必须匹配的签名。event_name
事件的名称。return_value
事件访问器方法的返回值。 返回类型必须是为了通过验证, void。参数
(可选)参数raise方法的签名匹配的委托参数。
备注
事件是委托和触发的事件作出响应,并允许从任何类客户端注册方法符合签名,并且基础委托的返回类型的成员函数 (事件处理程序) 之间的关联。
此委托可以有一个或多个关联的方法,当您的代码指示事件发生时将调用。 一个程序中的事件可供其他程序的目标。NET 框架公共语言运行库。 请参阅引发其他程序集中定义事件有关的示例。
有两种类型的事件声明:
事件数据成员
由编译器为数据成员事件创建事件,委托类型的成员的形式存储。 必须在类内声明事件的数据成员。 这也是一个普通的事件 (参见下面的代码示例。事件块
事件块使您可以通过添加、 删除和加薪方法实现自定义的添加、 删除和加薪方法的行为。 添加、 删除和加薪方法的签名必须与委托的签名相匹配。 事件阻止事件不是数据成员和任何用作数据成员将生成编译器错误。 请参阅定义的事件访问器方法有关的示例。
该事件处理程序的返回类型必须与该委托的返回类型相匹配。
在中。NET 框架中,您可以将处理数据成员,就好像方法本身 (即, Invoke及其相应的委托的方法)。 受管理的事件的数据成员的声明,则必须预定义的委托类型。 与此相反,受管理的事件方法隐式定义相应的托管的委托如果未定义。 请参阅本主题后面的示例,在该代码示例。
在声明托管的事件时,您可以指定添加和移除事件处理程序中添加或删除时将调用相应的访问器使用 + 运算符 = 和-=。 在添加、 删除和 raise 方法可以被显式调用。
要创建和使用 Visual c + + 中的事件,必须采取下列步骤:
创建或标识一个委托。 如果要定义您自己的活动,还必须确保没有使用委托event关键字。 如果事件预定义,在。NET 框架,然后该事件的使用者只需要知道委托的名称。
创建一个类,包含:
创建委托的事件。
(可选)一个方法来验证与声明的委托的实例event关键字存在。 否则,此逻辑必须放在代码中引发此事件。
调用此事件的方法。 这些方法可以重写基类中的某些功能。
此类定义的事件。
将方法连接到该事件的一个或多个类定义。 每个类会将一个或多个方法与基类中的事件相关联。
使用此事件:
创建包含事件声明的类的对象。
创建包含事件定义的类的对象。
有关详细信息C++/CLI事件,请参阅
要求
编译器选项:/clr
示例
示例
下面的代码示例演示如何声明对委托、 事件和事件处理程序。 订阅 (添加) 的事件处理程序。 调用事件处理程序。 (删除) 然后取消订阅和事件处理程序。
// mcppv2_events.cpp
// compile with: /clr
using namespace System;
// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);
// class that defines events
ref class EventSource {
public:
event ClickEventHandler^ OnClick; // declare the event OnClick
event DblClickEventHandler^ OnDblClick; // declare OnDblClick
void FireEvents() {
// raises events
OnClick(7, 3.14159);
OnDblClick("Hello");
}
};
// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
void OnMyClick(int i, double d) {
Console::WriteLine("OnClick: {0}, {1}", i, d);
}
void OnMyDblClick(String^ str) {
Console::WriteLine("OnDblClick: {0}", str);
}
};
int main() {
EventSource ^ MyEventSource = gcnew EventSource();
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
// hook handler to event
MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
// invoke events
MyEventSource->FireEvents();
// unhook handler to event
MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}
Output
示例
下面的代码示例演示如何使用生成的逻辑raise常用事件的方法: 如果该事件具有一个或多个订阅服务器,则调用raise方法隐式或显式调用该委托。 如果该委托的返回类型不是void以及是否有零个事件订户, raise方法返回的委托类型的默认值。 如果不有任何事件订户,调用raise方法只是返回,并会引发任何异常。 如果委托的返回类型不是void,则返回的委托类型。
// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
int i;
event Del^ MyEvent;
void FireEvent() {
i = MyEvent();
}
};
ref struct EventReceiver {
int OnMyClick() { return 0; }
};
int main() {
C c;
c.i = 687;
c.FireEvent();
Console::WriteLine(c.i);
c.i = 688;
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
Console::WriteLine(c.i);
}
Output