event (C++/CLI および C++/CX)event (C++/CLI and C++/CX)

event キーワードは "イベント" を宣言します。イベントとは、登録済みのサブスクライバー ("イベント ハンドラー") に重要な事態が発生したことを伝える通知です。The event keyword declares an event, which is a notification to registered subscribers (event handlers) that something of interest has occurred.

すべてのランタイムAll Runtimes

C++/CX では、"イベント メンバー" または "イベント ブロック" の宣言がサポートされます。C++/CX supports declaring an event member or an event block. イベント メンバーは、イベント ブロックを宣言する簡単な表記法です。An event member is shorthand for declaring an event block. 既定ではイベント メンバーは、イベント ブロックで明示的に宣言される、add() 関数、remove() 関数、および raise() 関数を宣言します。By default, an event member declares the add(), remove(), and raise() functions that are declared explicitly in an event block. イベント メンバーの関数をカスタマイズするには、イベント ブロックを宣言した後で必要な関数をオーバーライドします。To customize the functions in an event member, declare an event block instead and then override the functions that you require.

構文Syntax

// event data member
modifiereventdelegate^ event_name;

// event block
modifiereventdelegate^ event_name
{
   modifierreturn_valueadd(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

パラメーターParameters

modifiermodifier
イベントの宣言またはイベントのアクセサー メソッドで使用できる修飾子。A modifier that can be used on either the event declaration or an event accessor method. 可能な値は staticvirtual です。Possible values are static and virtual.

delegatedelegate
デリゲート。このデリゲートのシグネチャがイベント ハンドラーと一致する必要があります。The delegate, whose signature the event handler must match.

event_nameevent_name
イベントの名前です。The name of the event.

return_valuereturn_value
イベントのアクセサー メソッドの戻り値。The return value of the event accessor method. 検証可能にするために、戻り値の型は void にする必要があります。To be verifiable, the return type must be void.

parametersparameters
(省略可能) delegate パラメーターのシグネチャと一致する、raise メソッドのパラメーター。(optional) Parameters for the raise method, which match the signature of the delegate parameter.

解説Remarks

イベントとは、イベントのトリガーに応答する、デリゲートとメンバー関数 (イベント ハンドラー) の間の関連付けです。イベントによって、任意のクラスのクライアントが、基になるデリゲートのシグネチャおよび戻り値の型に準拠したメソッドを登録できます。An event is an association between a delegate and a member function (event handler) that responds to the triggering of the event and allows clients from any class to register methods that comply with the signature and return type of the underlying delegate.

イベントの宣言には 2 つの種類があります。There are two kinds of events declarations:

"イベント データ メンバー"event data member
コンパイラが自動的にデリゲート型のメンバーの形でイベント用のストレージを作成し、内部の add()remove()、および raise() の各メンバー関数を作成します。The compiler automatically creates storage for the event in the form of a member of the delegate type, and creates internal add(), remove(), and raise() member functions. イベント データ メンバーはクラス内で宣言する必要があります。An event data member must be declared inside a class. デリゲートの戻り値の型と、イベント ハンドラーの戻り値の型が一致する必要があります。The return type of the return type of the delegate must match the return type of the event handler.

"イベント ブロック"event block
イベント ブロックを使用して、add()remove()、および raise() の各メソッドの動作を明示的に宣言し、カスタマイズすることができます。An event block enables you to explicitly declare and customize the behavior of the add(), remove(), and raise() methods.

operators+=operator-= を使用して、イベント ハンドラーの追加と削除を行うことも、add() メソッドと remove() メソッドを明示的に呼び出すこともできます。You can use operators+= and operator-= to add and remove an event handler, or call the add() and remove() methods explicitly.

event は状況依存キーワードです。詳細については、「状況依存キーワード」を参照してください。event is a context-sensitive keyword; see Context-Sensitive Keywords for more information.

Windows ランタイムWindows Runtime

解説Remarks

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

イベント ハンドラーを追加した後で削除する場合は、追加操作で返される EventRegistrationToken 構造体を保存する必要があります。If you intend to add and then remove an event handler, you must save the EventRegistrationToken structure that is returned by the add operation. その後の削除操作で、削除するイベント ハンドラーを識別するために、保存しておいた EventRegistrationToken 構造体を使用します。Then in the remove operation, you must use the saved EventRegistrationToken structure to identify the event handler to be removed.

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime

event キーワードを使用して、イベントを宣言できます。The event keyword lets you declare an event. イベントは、何か重要なことが起きたときにクラスで通知するための手段です。An event is a way for a class to provide notifications when something of interest happens.

構文Syntax

// event data member
modifiereventdelegate^ event_name;

// event block
modifiereventdelegate^ event_name
{
   modifierreturn_valueadd(delegate^ name);
   modifier void remove(delegate^ name);
   modifier void raise(parameters);
}

パラメーターParameters

modifiermodifier
イベントの宣言またはイベントのアクセサー メソッドで使用できる修飾子。A modifier that can be used on either the event declaration or an event accessor method. 可能な値は staticvirtual です。Possible values are static and virtual.

delegatedelegate
デリゲート。このデリゲートのシグネチャがイベント ハンドラーと一致する必要があります。The delegate, whose signature the event handler must match.

event_nameevent_name
イベントの名前です。The name of the event.

return_valuereturn_value
イベントのアクセサー メソッドの戻り値。The return value of the event accessor method. 検証可能にするために、戻り値の型は void にする必要があります。To be verifiable, the return type must be void.

parametersparameters
(省略可能) delegate パラメーターのシグネチャと一致する、raise メソッドのパラメーター。(optional) Parameters for the raise method, which match the signature of the delegate parameter.

解説Remarks

イベントとは、イベントのトリガーに応答する、デリゲートとメンバー関数 (イベント ハンドラー) の間の関連付けです。イベントによって、任意のクラスのクライアントが、基になるデリゲートのシグネチャおよび戻り値の型に準拠したメソッドを登録できます。An event is an association between a delegate and a member function (event handler) that responds to the triggering of the event and allows clients from any class to register methods that comply with the signature and return type of the underlying delegate.

デリゲートには、イベントが発生したことをコードによって示すときに呼び出されるメソッドを 1 つ以上関連付けることができます。The delegate can have one or more associated methods that will be called when your code indicates that the event has occurred. プログラム内のイベントを、.NET Framework 共通言語ランタイムを対象とする他のプログラムで使用できるようにすることができます。An event in one program can be made available to other programs that target the .NET Framework common language runtime.

イベントの宣言には 2 つの種類があります。There are two kinds of events declarations:

"イベント データ メンバー"event data members
データ メンバー イベントについては、コンパイラによってイベント用のストレージがデリゲート型のメンバーの形で作成されます。Storage for the event, in the form of a member of the delegate type, is created by the compiler for data member events. イベント データ メンバーはクラス内で宣言する必要があります。An event data member must be declared inside a class. これは、単純なイベントとも呼ばれます (下のコード サンプルを参照してください)。This is also known as a trivial event (see code sample below.)

"イベント ブロック"event blocks
イベント ブロックを使用し、add、remove、および raise の各メソッドを実装することで、add、remove、および raise の各メソッドの動作をカスタマイズすることができます。Event blocks let you customize the behavior of the add, remove, and raise methods, by implementing add, remove, and raise methods. add、remove、および raise の各メソッドのシグネチャが、デリゲートのシグネチャと一致する必要があります。The signature of the add, remove, and raise methods must match the signature of the delegate. イベント ブロック イベントはデータ メンバーではなく、データ メンバーとして使用した場合はコンパイル エラーが生成されます。Event block events are not data members and any use as a data member will generate a compiler error.

イベント ハンドラーの戻り値の型は、デリゲートの戻り値の型と一致する必要があります。The return type of the event handler must match the return type of the delegate.

.NET Framework では、それ自身がメソッド (つまり、対応するデリゲートの Invoke メソッド) であるかのようにデータ メンバーを処理できます。In the .NET Framework, you can treat a data member as if it were a method itself (that is, the Invoke method of its corresponding delegate). マネージド イベント データ メンバーを宣言するためのデリゲート型を事前に定義する必要があります。You must predefine the delegate type for declaring a managed event data member. これに対し、マネージド イベント メソッドは、まだ定義されていない場合、対応するマネージド デリゲートを暗黙的に定義します。In contrast, a managed event method implicitly defines the corresponding managed delegate if it is not already defined. 例については、このトピックの最後にあるコード サンプルを参照してください。See the code sample at the end of this topic for an example.

マネージド イベントを宣言するときは、演算子 += および -= を使用してイベント ハンドラーを追加または削除したときに呼び出される追加アクセサーおよび削除アクセサーを指定できます。When declaring a managed event, you can specify add and remove accessors that will be called when event handlers are added or removed using operators += and -=. add、remove、および raise の各メソッドを明示的に呼び出すことができます。The add, remove and raise methods can be called explicitly.

Visual C++ でイベントを作成して使用するには、次の手順に従う必要があります。The following steps must be taken in order to create and use events in Visual C++:

  1. デリゲートを作成または指定します。Create or identify a delegate. 独自のイベントを定義する場合は、event キーワードで使用するデリゲートが存在することも確認する必要があります。If you are defining your own event, you must also ensure that there is a delegate to use with the event keyword. イベントが .NET Framework などで事前に定義されている場合、そのイベントのコンシューマーにはデリゲートの名前を指定するだけでかまいません。If the event is predefined, in the .NET Framework for example, then consumers of the event need only know the name of the delegate.

  2. 次のものを含むクラスを作成します。Create a class that contains:

    • デリゲートから作成されるイベント。An event created from the delegate.

    • (省略可能) event キーワードで宣言されたデリゲートのインスタンスが存在することを検証するメソッド。(Optional) A method that verifies that an instance of the delegate declared with the event keyword exists. 省略する場合、イベントを発生させるコード内にこのロジックを組み込む必要があります。Otherwise, this logic must be placed in the code that fires the event.

    • イベントを呼び出すメソッド。Methods that call the event. このメソッドは一部の基本クラスの機能によってオーバーライドされる場合があります。These methods can be overrides of some base class functionality.

    このクラスでイベントを定義します。This class defines the event.

  3. メソッドをイベントに接続するクラスを 1 つ以上定義します。Define one or more classes that connect methods to the event. それぞれのクラスで、1 つ以上のメソッドを基本クラスのイベントと関連付けます。Each of these classes will associate one or more methods with the event in the base class.

  4. イベントを使用します。Use the event:

    • イベントの宣言を含むクラスのオブジェクトを作成します。Create an object of the class that contains the event declaration.

    • イベントの定義を含むクラスのオブジェクトを作成します。Create an object of the class that contains the event definition.

C++/CLI イベントの詳細については、次を参照してください。For more information on C++/CLI events, see

要件Requirements

コンパイラ オプション: /clrCompiler option: /clr

使用例Examples

次のコード例では、デリゲート、イベント、およびイベント ハンドラーのペアを宣言します。次に、イベント ハンドラーをサブスクライブ (追加) し、そのイベント ハンドラーを呼び出した後、サブスクライブ解除 (削除) します。The following code example demonstrates declaring pairs of delegates, events, and event handlers; subscribing (adding) the event handlers; invoking the event handlers; and then unsubscribing (removing) the event handlers.

// 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 メソッドを呼び出すと、デリゲートが暗黙的または明示的に呼び出されます。The following code example demonstrates the logic used to generate the raise method of a trivial event: If the event has one or more subscribers, calling the raise method implicitly or explicitly calls the delegate. デリゲートの戻り値の型が void ではなく、なおかつイベント サブスクライバーが存在しない場合、raise メソッドはデリゲート型の既定値を返します。If the delegate's return type is not void and if there are zero event subscribers, the raise method returns the default value for the delegate type. イベント サブスクライバーが存在しない場合に raise メソッドを呼び出すと、単純に返されるだけで、例外は発生しません。If there are no event subscribers, calling the raise method simply returns and no exception is raised. デリゲートの戻り値の型が void 以外の場合、デリゲート型が返されます。If the delegate return type is not void, the delegate type is returned.

// 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

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP