event 關鍵字 (C++/CLI 和 C++/CX)

event關鍵字會 宣告事件 ,這是向已註冊的訂閱者(事件處理常式 )通知 ,表示發生感興趣的事件。

所有執行階段

C++/CX 支援宣告事件成員事件區塊。 事件成員是用來宣告事件區塊的速記。 根據預設,事件成員會宣告事件區塊中明確宣告的 addremoveraise 函式。 若要自訂事件成員中的函式,請改為宣告事件區塊,然後覆寫您所需要的函數。

語法

// 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
事件宣告或事件存取子方法上可使用的修飾詞。 可能的值是 staticvirtual

delegate
委派,事件處理常式必須符合其簽章。

event_name
事件的名稱。

return_value
事件存取子方法的傳回值。 若要驗證,傳回型別必須是 void

parameters
(選擇性) raise 方法的參數,其符合 delegate 參數的簽章。

備註

事件是委派與 事件處理常式 之間的關聯。 事件處理常式是成員函式,會在觸發事件時回應。 它可讓來自任何類別的用戶端註冊符合簽章和傳回委派類型的方法。

有兩種類型的事件宣告:

事件資料成員
編譯器會自動以委派類型成員的形式建立事件的儲存體,並建立內部 addremoveraise 成員函式。 事件資料成員必須在類別內宣告。 委派的傳回類型必須符合處理常式的事件的傳回類型。

事件區塊
事件區塊可讓您明確宣告和自訂 addremoveraise 方法的行為。

您可以使用 operator +=operator -= 來新增和移除事件處理常式,或明確呼叫 addremove 方法。

event 是即時線上關鍵字。 如需詳細資訊,請參閱 上下文相關關鍵字

Windows 執行階段

備註

如需詳細資訊,請參閱事件 (C++/CX) \(部分機器翻譯\)。

若要新增及稍後移除事件處理常式,請儲存 EventRegistrationToken 作業所 add 傳回的結構。 然後在作業中 remove ,使用儲存 EventRegistrationToken 的結構來識別要移除的事件處理常式。

需求

編譯器選項:/ZW

Common Language Runtime

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
事件宣告或事件存取子方法上可使用的修飾詞。 可能的值是 staticvirtual

delegate
委派,事件處理常式必須符合其簽章。

event_name
事件的名稱。

return_value
事件存取子方法的傳回值。 若要驗證,傳回型別必須是 void

parameters
(選擇性) raise 方法的參數,其符合 delegate 參數的簽章。

備註

事件是委派與 事件處理常式 之間的關聯。 事件處理常式是成員函式,會在觸發事件時回應。 它允許來自任何類別的用戶端註冊符合簽章和基礎委派傳回型別的方法。

委派可以有一或多個相關聯的方法。 當您的程式碼指出事件發生時,會呼叫這些方法。 一個程式中的事件可供以 .NET Framework Common Language Runtime 為目標的其他程式使用。

事件宣告有兩種:

事件資料成員
編譯器會將資料成員事件的儲存體建立為委派類型的成員。 事件資料成員必須在類別內宣告。 它也稱為 微不足道的事件 。 如需範例,請參閱程式碼範例。

事件區塊
事件區塊可讓您藉由實作 、 remove 和 方法來自訂 、 removeraiseraise 方法的行為 addaddremoveraise 方法的 add 簽章必須符合委派的簽章。 事件區塊事件不是資料成員。 任何做為資料成員的 用法都會產生編譯器錯誤。

事件處理常式的傳回類型必須符合委派的傳回類型。

在 .NET Framework 中,您可以將資料成員視同方法本身 (也就是,其對應委派的 Invoke 方法)。 若要這樣做,請預先定義委派類型,以宣告 Managed 事件資料成員。 相反地,如果尚未定義 Managed 事件方法,則會隱含定義對應的 Managed 委派。 如需範例,請參閱本文結尾的程式碼範例。

宣告 Managed 事件時,您可以使用 運算子 +=-= 來指定 addremove 存取子,以在新增或移除事件處理常式時呼叫。 add可以明確呼叫 、 removeraise 方法。

您必須採取下列步驟,才能在 Microsoft C++ 中建立及使用事件:

  1. 建立或識別委派。 如果您要定義自己的事件,您也必須確定有委派可搭配 event 關鍵字使用。 如果已預先定義事件 (例如在 .NET Framework 中),則事件的取用者只需要知道委派的名稱。

  2. 建立包含下列的類別:

    • 從委派建立的事件。

    • (選擇性)方法,可驗證以 event 關鍵字宣告之委派的實例存在。 否則,此邏輯必須放置在引發事件的程式碼中。

    • 呼叫此事件的方法。 這些方法可以是某些基底類別功能的覆寫。

    這個類別會定義事件。

  3. 定義將方法連接到事件的一或多個類別。 每個類別會將一個或多個方法與基底類別中的事件建立關聯。

  4. 使用事件:

    • 建立物件的類別,其中包含事件宣告。

    • 建立物件的類別,其中包含事件定義。

如需 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

另請參閱

適用於.NET 和 UWP 的元件延伸模組