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

関数ポインターを表す型を宣言します。Declares a type that represents a function pointer.

すべてのランタイムAll Runtimes

デリゲートは、Windows ランタイムと共通言語ランタイムでサポートされます。Both the Windows Runtime and common language runtime support delegates.

解説Remarks

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

コンパイル時に、型がデリゲートかどうかを検出するには、__is_delegate() 型の特徴を使用します。To detect at compile time if a type is a delegate, use the __is_delegate() type trait. 詳細については、「型の特徴のコンパイラ サポート」を参照してください。For more information, see Compiler Support for Type Traits.

Windows ランタイムWindows Runtime

C++/CX では、次の構文でデリゲートをサポートします。C++/CX supports delegates with the following syntax.

構文Syntax

access
delegate
return-type
delegate-type-identifier
(
[ parameters ]
)

パラメーターParameters

accessaccess
(省略可能) デリゲートのアクセシビリティ。public (既定値) または private が可能です。(optional) The accessibility of the delegate, which can be public (the default) or private. 関数プロトタイプも、const または volatile キーワードで修飾できます。The function prototype can also be qualified with the const or volatile keywords.

return-typereturn-type
関数プロトタイプの戻り値の型。The return type of the function prototype.

delegate-type-identifierdelegate-type-identifier
宣言されるデリゲート型の名前。The name of the declared delegate type.

parametersparameters
(省略可能) 関数プロトタイプの型と識別子。(Optional) The types and identifiers of the function prototype.

解説Remarks

delegate-type-identifier を使用して、デリゲートと同じプロトタイプのイベントを宣言します。Use the delegate-type-identifier to declare an event with the same prototype as the delegate. 詳細については、「デリゲート (C++/CX)」を参照してください。For more information, see Delegates (C++/CX).

要件Requirements

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

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

共通言語ランタイムでは、次の構文でデリゲートをサポートします。The common language runtime supports delegates with the following syntax.

構文Syntax

access
delegate
function_declaration

パラメーターParameters

accessaccess
(省略可能) アセンブリの外部でのデリゲートのアクセシビリティは、public または private が可能です。(optional) The accessibility of the delegate outside of the assembly can be public or private. 既定値は private です。The default is private. クラス内では、デリゲートに任意のアクセシビリティを指定できます。Inside a class, a delegate can have any accessibility.

function_declarationfunction_declaration
デリゲートにバインドできる関数のシグネチャ。The signature of the function that can be bound to the delegate. デリゲートの戻り値の型には、任意のマネージ型を指定できます。The return type of a delegate can be any managed type. 相互運用性の理由から、デリゲートの戻り値の型は CLS 型にすることをお勧めします。For interoperability reasons, it is recommended that the return type of a delegate be a CLS type.

バインドされていないデリゲートを定義するには、function_declaration の最初のパラメーターを、オブジェクトの this ポインターの型にする必要があります。To define an unbound delegate, the first parameter in function_declaration should be the type of the this pointer for the object.

解説Remarks

デリゲートはマルチキャストです。"関数ポインター" を、マネージド クラス内の 1 つまたは複数のメソッドにバインドできます。Delegates are multicast: the "function pointer" can be bound to one or more methods within a managed class. delegate キーワードは、特定のメソッド シグネチャを持つマルチキャスト デリゲート型を定義します。The delegate keyword defines a multicast delegate type with a specific method signature.

デリゲートは、静的メソッドなどの値クラスのメソッドにバインドすることもできます。A delegate can also be bound to a method of a value class, such as a static method.

デリゲートには、次の特性があります。A delegate has the following characteristics:

  • System::MulticastDelegate から継承します。It inherits from System::MulticastDelegate.

  • マネージド クラスまたは NULL へのポインター (静的メソッドへのバインドの場合) と、指定した型の完全修飾メソッドという 2 つの引数を受け取るコンストラクターがあります。It has a constructor that takes two arguments: a pointer to a managed class or NULL (in the case of binding to a static method) and a fully qualified method of the specified type.

  • Invoke というメソッドを持ち、そのシグネチャはデリゲートの宣言されたシグネチャと一致します。It has a method called Invoke, whose signature matches the declared signature of the delegate.

デリゲートが呼び出されると、関数がアタッチされた順序で呼び出されます。When a delegate is invoked, its function(s) are called in the order they were attached.

デリゲートの戻り値は、最後にアタッチされたメンバー関数からの戻り値です。The return value of a delegate is the return value from its last attached member function.

デリゲートはオーバーロードできません。Delegates cannot be overloaded.

デリゲートは、バインドありもバインドなしも可能です。Delegates can be bound or unbound.

バインドされたデリゲートをインスタンス化するときは、最初の引数をオブジェクト参照にします。When you instantiate a bound delegate, the first argument shall be an object reference. デリゲートのインスタンス化の 2 番目の引数を、マネージド クラス オブジェクトのメソッドのアドレス、または値型のメソッドへのポインターにします。The second argument of a delegate instantiation shall either be the address of a method of a managed class object, or a pointer to a method of a value type. デリゲートのインスタンス化の 2 番目の引数は、完全クラス スコープ構文でメソッドに名前を付け、address-of 演算子を適用する必要があります。The second argument of a delegate instantiation must name the method with the full class scope syntax and apply the address-of operator.

バインドされていないデリゲートをインスタンス化するときは、最初の引数を、マネージド クラス オブジェクトのメソッドのアドレス、または値型のメソッドへのポインターにします。When you instantiate an unbound delegate, the first argument shall either be the address of a method of a managed class object, or a pointer to a method of a value type. この引数は、完全クラス スコープ構文でメソッドに名前を付け、address-of 演算子を適用する必要があります。The argument must name the method with the full class scope syntax and apply the address-of operator.

静的またはグローバル関数のデリゲートを作成する場合は、1 つのパラメーターのみが必要です (必要に応じて関数のアドレスを指定できます)。When creating a delegate to a static or global function, only one parameter is required: the function (optionally, the address of the function).

デリゲートの詳細については、以下を参照してください。For more information on delegates, see

要件Requirements

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

使用例Examples

次の例では、デリゲートの宣言、初期化、および呼び出し方法を示します。The following example shows how to declare, initialize, and invoke delegates.

// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;

// declare a delegate
public delegate void MyDel(int i);

ref class A {
public:
   void func1(int i) {
      Console::WriteLine("in func1 {0}", i);
   }

   void func2(int i) {
      Console::WriteLine("in func2 {0}", i);
   }

   static void func3(int i) {
      Console::WriteLine("in static func3 {0}", i);
   }
};

int main () {
   A ^ a = gcnew A;

   // declare a delegate instance
   MyDel^ DelInst;

   // test if delegate is initialized
   if (DelInst)
      DelInst(7);

   // assigning to delegate
   DelInst = gcnew MyDel(a, &A::func1);

   // invoke delegate
   if (DelInst)
      DelInst(8);

   // add a function
   DelInst += gcnew MyDel(a, &A::func2);

   DelInst(9);

   // remove a function
   DelInst -= gcnew MyDel(a, &A::func1);

   // invoke delegate with Invoke
   DelInst->Invoke(10);

   // make delegate to static function
   MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
   StaticDelInst(11);
}
in func1 8

in func1 9

in func2 9

in func2 10

in static func3 11

関連項目See also

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