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
(省略可能) delegate パラメーターのシグネチャと一致する、raise メソッドのパラメーター。

解説

イベントは、デリゲートとイベント ハンドラーの間の関連付けです。 イベント ハンドラーは、イベントがトリガーされたときに応答するメンバー関数です。 これにより、任意のクラスのクライアントが、デリゲートのシグネチャと戻り値の型に一致するメソッドを登録できるようになります。

イベントの宣言には 2 つの種類があります。

"イベント データ メンバー"
コンパイラが自動的にデリゲート型のメンバーの形でイベント用のストレージを作成し、内部の addremove、および raise の各メンバー関数を作成します。 イベント データ メンバーはクラス内で宣言する必要があります。 デリゲートの戻り値の型と、イベント ハンドラーの戻り値の型が一致する必要があります。

"イベント ブロック"
イベント ブロックを使用して、addremove、および raise の各メソッドの動作を明示的に宣言し、カスタマイズすることができます。

operator += および operator -= を使用して、イベント ハンドラーの追加と削除を行うことも、add メソッドおよび remove メソッドを明示的に呼び出すこともできます。

event は状況依存のキーワードです。 詳細については、「状況依存キーワード」を参照してください。

Windows ランタイム

解説

詳細については、「イベント (C++/CX)」を参照してください。

イベント ハンドラーを追加して後で削除するには、add 操作によって返される EventRegistrationToken 構造体を保存します。 次に、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
(省略可能) delegate パラメーターのシグネチャと一致する、raise メソッドのパラメーター。

解説

イベントは、デリゲートとイベント ハンドラーの間の関連付けです。 イベント ハンドラーは、イベントがトリガーされたときに応答するメンバー関数です。 これにより、任意のクラスのクライアントが、基になるデリゲートのシグネチャと戻り値の型に一致するメソッドを登録できるようになります。

デリゲートには、1 つ以上のメソッドを関連付けることができます。 これらのメソッドは、イベントが発生したことをコードが示すときに呼び出されます。 プログラム内のイベントを、.NET Framework 共通言語ランタイムを対象とする他のプログラムで使用できるようにすることができます。

イベントの宣言には 2 つの種類があります。

"イベント データ メンバー"
コンパイラは、データ メンバー イベントのストレージをデリゲート型のメンバーとして作成します。 イベント データ メンバーはクラス内で宣言する必要があります。 これは、トリビアる イベントとも呼ばれます。 例については、コード サンプルを参照してください。

"イベント ブロック"
イベント ブロックを使用すると、addremove、および raise メソッドを実装することで、addremove、および raise メソッドの動作をカスタマイズできます。 addremove、および raise の各メソッドのシグネチャが、デリゲートのシグネチャと一致する必要があります。 イベント ブロックのイベントはデータ メンバーではありません。 データ メンバーとして使用すると、コンパイラ エラーが生じます。

イベント ハンドラーの戻り値の型は、デリゲートの戻り値の型と一致する必要があります。

.NET Framework では、それ自身がメソッド (つまり、対応するデリゲートの Invoke メソッド) であるかのようにデータ メンバーを処理できます。 これを行うには、マネージド イベント データ メンバーを宣言するためのデリゲート型を事前に定義します。 これに対し、マネージド イベント メソッドは、まだ定義されていない場合、対応するマネージド デリゲートを暗黙的に定義します。 例については、この記事の最後にあるコード サンプルを参照してください。

マネージド イベントを宣言するときは、演算子 += および -= を使用してイベント ハンドラーを追加または削除したときに呼び出される add アクセサーおよび remove アクセサーを指定できます。 addremove、および raise メソッドは、明示的に呼び出すことができます。

Microsoft C++ でイベントを作成して使用するには、次の手順に従う必要があります。

  1. デリゲートを作成または指定します。 独自のイベントを定義する場合は、event キーワードで使用するデリゲートが存在することも確認します。 イベントが .NET Framework などで事前に定義されている場合、そのイベントのコンシューマーにはデリゲートの名前を指定するだけでかまいません。

  2. 次のものを含むクラスを作成します。

    • デリゲートから作成されるイベント。

    • (省略可能) event キーワードで宣言されたデリゲートのインスタンスが存在することを検証するメソッド。 省略する場合、イベントを発生させるコード内にこのロジックを組み込む必要があります。

    • イベントを呼び出すメソッド。 このメソッドは一部の基本クラスの機能によってオーバーライドされる場合があります。

    このクラスでイベントを定義します。

  3. メソッドをイベントに接続するクラスを 1 つ以上定義します。 それぞれのクラスで、1 つ以上のメソッドを基本クラスのイベントと関連付けます。

  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 メソッドを生成するために使用されるロジックを示します。 イベントに 1 つまたは複数のサブスクライバーが含まれている場合は、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 用のコンポーネント拡張