event
關鍵字 (C++/CLI 和 C++/CX)
event
關鍵詞會宣告事件,這是向已註冊的訂閱者(事件處理程式)通知,表示發生感興趣的事件。
所有執行階段
C++/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);
}
參數
modifier
事件宣告或事件存取子方法上可使用的修飾詞。 可能的值是 static
和 virtual
。
delegate
委派,事件處理常式必須符合其簽章。
event_name
事件的名稱。
return_value
事件存取子方法的傳回值。 若要驗證,傳回型別必須是 void
。
parameters
(選擇性) raise
方法的參數,其符合 delegate 參數的簽章。
備註
事件是委派與 事件處理程式之間的關聯。 事件處理程式是成員函式,會在觸發事件時回應。 它可讓來自任何類別的客戶端註冊符合簽章和傳回委派類型的方法。
有兩種類型的事件宣告:
事件資料成員
編譯器會自動以委派類型成員的形式建立事件的儲存體,並建立內部 add
、remove
和 raise
成員函式。 事件資料成員必須在類別內宣告。 委派的傳回類型必須符合處理常式的事件的傳回類型。
事件區塊
事件區塊可讓您明確宣告和自訂 add
、remove
和 raise
方法的行為。
您可以使用 operator +=
和 operator -=
來新增和移除事件處理程式,或明確呼叫 add
和 remove
方法。
event
是即時線上關鍵字。 如需詳細資訊,請參閱 上下文相關關鍵詞。
Windows 執行階段
備註
如需詳細資訊,請參閱事件 (C++/CX) \(部分機器翻譯\)。
若要新增及稍後移除事件處理程式,請儲存 EventRegistrationToken
作業所 add
傳回的結構。 然後在作業中 remove
,使用儲存 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);
}
參數
modifier
事件宣告或事件存取子方法上可使用的修飾詞。 可能的值是 static
和 virtual
。
delegate
委派,事件處理常式必須符合其簽章。
event_name
事件的名稱。
return_value
事件存取子方法的傳回值。 若要驗證,傳回型別必須是 void
。
parameters
(選擇性) raise
方法的參數,其符合 delegate 參數的簽章。
備註
事件是委派與 事件處理程式之間的關聯。 事件處理程式是成員函式,會在觸發事件時回應。 它允許來自任何類別的客戶端註冊符合簽章和基礎委派傳回型別的方法。
委派可以有一或多個相關聯的方法。 當您的程式代碼指出事件發生時,會呼叫這些方法。 一個程式中的事件可供以 .NET Framework Common Language Runtime 為目標的其他程式使用。
事件宣告有兩種:
事件資料成員
編譯程式會將數據成員事件的記憶體建立為委派類型的成員。 事件資料成員必須在類別內宣告。 它也稱為 微不足道的事件。 如需範例,請參閱程式碼範例。
事件區塊
事件區塊可讓您藉由實作、 remove
和 方法來自定義、 remove
和 raise
raise
方法的行為add
。add
、 remove
和 raise
方法的add
簽章必須符合委派的簽章。 事件區塊事件不是數據成員。 任何做為數據成員的 用法都會產生編譯程序錯誤。
事件處理常式的傳回類型必須符合委派的傳回類型。
在 .NET Framework 中,您可以將資料成員視同方法本身 (也就是,其對應委派的 Invoke
方法)。 若要這麼做,請預先定義用來宣告受控事件資料成員的委派類型。 相反地,受控事件方法會隱含定義對應的受控委派 (如果尚未定義的話)。 如需範例,請參閱本文結尾的程式代碼範例。
宣告 Managed 事件時,您可以使用 運算子 +=
和 -=
來指定 add
和 remove
存取子,以在新增或移除事件處理程式時呼叫。 add
可以明確呼叫、 remove
和 raise
方法。
您必須採取下列步驟,才能在Microsoft C++中建立及使用事件:
建立或識別委派。 如果您要定義自己的事件,您也必須確定有委派可搭配
event
關鍵詞使用。 如果已預先定義事件 (例如在 .NET Framework 中),則事件的取用者只需要知道委派的名稱。建立包含下列的類別:
從委派建立的事件。
(選擇性)方法,可驗證以
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);
}
OnClick: 7, 3.14159
OnDblClick: Hello
下列程式代碼範例示範用來產生 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);
}
0
688