Delegate クラス

定義

デリゲートを表します。デリゲートとは、静的メソッドを参照するデータ構造、またはクラス インスタンスおよびクラスのインスタンス メソッドを参照するデータ構造です。

public ref class Delegate abstract
public ref class Delegate abstract : ICloneable, System::Runtime::Serialization::ISerializable
public abstract class Delegate
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Delegate : ICloneable, System.Runtime.Serialization.ISerializable
type Delegate = class
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
type Delegate = class
    interface ICloneable
    interface ISerializable
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Delegate = class
    interface ICloneable
    interface ISerializable
Public MustInherit Class Delegate
Public MustInherit Class Delegate
Implements ICloneable, ISerializable
継承
Delegate
派生
属性
実装

次の例は、 という名前のデリゲートを定義する方法を示しています myMethodDelegate 。 このデリゲートのインスタンスは、入れ子になったクラスのインスタンス メソッドと静的メソッドに対して作成 mySampleClass されます。 インスタンス メソッドのデリゲートには、 のインスタンスが必要です mySampleClass 。 インスタンス mySampleClass は、 という名前の変数に保存されます mySC

using namespace System;
delegate String^ myMethodDelegate( // Declares a delegate for a method that takes in an int and returns a String.
int myInt );

// Defines some methods to which the delegate can point.
ref class mySampleClass
{
public:

   // Defines an instance method.
   String^ myStringMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("positive");

      if ( myInt < 0 )
            return ("negative");

      return ("zero");
   }


   // Defines a static method.
   static String^ mySignMethod( int myInt )
   {
      if ( myInt > 0 )
            return ("+");

      if ( myInt < 0 )
            return ("-");

      return ("");
   }

};

int main()
{
   
   // Creates one delegate for each method. For the instance method, an 
   // instance (mySC) must be supplied. For the static method, only the
   // method name is needed.
   mySampleClass^ mySC = gcnew mySampleClass;
   myMethodDelegate^ myD1 = gcnew myMethodDelegate( mySC, &mySampleClass::myStringMethod );
   myMethodDelegate^ myD2 = gcnew myMethodDelegate( mySampleClass::mySignMethod );
   
   // Invokes the delegates.
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".",  -3, myD1(  -3 ), myD2(  -3 ) );
   Console::WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}

/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
using System;
public class SamplesDelegate  {

   // Declares a delegate for a method that takes in an int and returns a string.
   public delegate string myMethodDelegate( int myInt );

   // Defines some methods to which the delegate can point.
   public class mySampleClass  {

      // Defines an instance method.
      public string myStringMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "positive" );
         if ( myInt < 0 )
            return( "negative" );
         return ( "zero" );
      }

      // Defines a static method.
      public static string mySignMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "+" );
         if ( myInt < 0 )
            return( "-" );
         return ( "" );
      }
   }

   public static void Main()  {

      // Creates one delegate for each method. For the instance method, an
      // instance (mySC) must be supplied. For the static method, use the
      // class name.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
      myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );

      // Invokes the delegates.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
   }
}


/*
This code produces the following output:

5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
Public Class SamplesDelegate

   ' Declares a delegate for a method that takes in an int and returns a String.
   Delegate Function myMethodDelegate(myInt As Integer) As [String]

   ' Defines some methods to which the delegate can point.
   Public Class mySampleClass

      ' Defines an instance method.
      Public Function myStringMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "positive"
         End If
         If myInt < 0 Then
            Return "negative"
         End If
         Return "zero"
      End Function 'myStringMethod

      ' Defines a static method.
      Public Shared Function mySignMethod(myInt As Integer) As [String]
         If myInt > 0 Then
            Return "+"
         End If
         If myInt < 0 Then
            Return "-"
         End If
         Return ""
      End Function 'mySignMethod
   End Class

   Public Shared Sub Main()

      ' Creates one delegate for each method. For the instance method, an
      ' instance (mySC) must be supplied. For the Shared method, the
      ' method name is qualified by the class name.
      Dim mySC As New mySampleClass()
      Dim myD1 As New myMethodDelegate(AddressOf mySC.myStringMethod)
      Dim myD2 As New myMethodDelegate(AddressOf mySampleClass.mySignMethod)

      ' Invokes the delegates.
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 5, myD1(5), myD2(5))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", - 3, myD1(- 3), myD2(- 3))
      Console.WriteLine("{0} is {1}; use the sign ""{2}"".", 0, myD1(0), myD2(0))

   End Sub

End Class


'This code produces the following output:
' 
'5 is positive; use the sign "+".
'-3 is negative; use the sign "-".
'0 is zero; use the sign "".

注釈

クラス Delegate は、デリゲート型の基本クラスです。 ただし、 クラスまたは クラスから明示的に派生できるのは、システムと Delegate コンパイラ MulticastDelegate のみです。 デリゲート型から新しい型を派生させるのも許可されない。 クラス Delegate はデリゲート型とは見なされません。デリゲート型の派生に使用されるクラスです。

ほとんどの言語では キーワードが実装され、それらの言語のコンパイラは クラスから派生できます。そのため、ユーザーは言語によって提供されるキーワード delegate MulticastDelegate delegate を使用する必要があります。

注意

共通言語ランタイムは、デリゲート型ごとに、デリゲートと同じシグネチャを Invoke 持つメソッドを提供します。 コンパイラによって自動的に呼び出されるので、C#、Visual Basic、または Visual C++ からこのメソッドを明示的に呼び出す必要があります。 メソッド Invoke は、デリゲート型 のシグネチャ を検索する場合にリフレクションで役立ちます。

共通言語ランタイムは、 メソッドと メソッドを使用して各デリゲート型を BeginInvoke EndInvoke 提供し、デリゲートの非同期呼び出しを有効にします。 これらのメソッドの詳細については、「同期メソッドの非同期 呼び出し」を参照してください

デリゲート型の宣言は、1 つ以上のメソッドのシグネチャを指定するコントラクトを確立します。 デリゲートは、次への参照を持つデリゲート型のインスタンスです。

  • 型のインスタンス メソッドと、その型に割り当て可能なターゲット オブジェクト。

  • 型のインスタンス メソッド。非表示のパラメーターが仮パラメーター this リストに公開されます。 デリゲートは、オープン インスタンス デリゲートと言います。

  • 静的メソッド。

  • メソッドの最初のパラメーターに割り当て可能な静的メソッドとターゲット オブジェクト。 デリゲートは、最初の引数で閉じられます。

デリゲート バインドの詳細については、メソッドのオーバーロードに関するページ CreateDelegate(Type, Object, MethodInfo, Boolean) を参照してください。

注意

.NET Framework バージョン 1.0 および 1.1 では、メソッドのシグネチャがデリゲート型で指定されたシグネチャと完全に一致する場合にのみ、デリゲートはメソッドを表す可能性があります。 したがって、前の一覧の最初と 3 番目の箇条書きだけがサポートされ、最初の箇条書きには完全な型の一致が必要です。

デリゲートが最初の引数 (最も一般的なケース) で閉じたインスタンス メソッドを表す場合、デリゲートはメソッドのエントリ ポイントへの参照と、メソッドを定義した型に割り当て可能な型である target と呼ばれる オブジェクトへの参照を格納します。 デリゲートは、開いているインスタンス メソッドを表す場合、メソッドのエントリ ポイントへの参照を格納します。 デリゲートシグネチャには、非表示パラメーターを仮パラメーター リストに含める必要があります。この場合、デリゲートはターゲット オブジェクトへの参照を持たず、デリゲートが呼び出されるとターゲット オブジェクトを指定する必要があります this

デリゲートが静的メソッドを表す場合、デリゲートはメソッドのエントリ ポイントへの参照を格納します。 デリゲートが最初の引数で閉じた静的メソッドを表す場合、デリゲートはメソッドのエントリ ポイントへの参照と、メソッドの最初の引数の型に割り当て可能なターゲット オブジェクトへの参照を格納します。 デリゲートが呼び出されると、静的メソッドの最初の引数はターゲット オブジェクトを受け取ります。 この最初の引数は参照型である必要があります。

デリゲートの呼び出しリストは、リストの各要素がデリゲートによって表されるメソッドの 1 つを呼び出す、順序付けされたデリゲートのセットです。 呼び出しリストには、重複するメソッドを含めできます。 呼び出し中、メソッドは呼び出しリストに表示される順序で呼び出されます。 デリゲートは、その呼び出しリスト内のすべてのメソッドを呼び出します。重複は、呼び出しリストに表示されるごとに 1 回呼び出されます。 デリゲートは変更できません。が作成されると、デリゲートの呼び出しリストは変更されません。

デリゲートは 1 つ以上のメソッドを呼び出し、操作の組み合わせで使用することができるため、デリゲートはマルチキャストまたは結合可能と呼ばれます。

や などの操作を組 Combine み合わせて Remove 、既存のデリゲートを変更しない。 代わりに、このような操作は、操作の結果を含む新しいデリゲート、変更されていないデリゲート、または を返します null 。 操作の結果が、少なくとも 1 つのメソッドを参照しないデリゲートである場合、結合操作は null を返します。 結合操作は、要求された操作に影響がない場合に、変更されていないデリゲートを返します。

注意

マネージド言語では、 メソッドと Combine メソッド Remove を使用してデリゲート操作を実装します。 たとえば、C# のデリゲート型の Visual Basic および ステートメント AddHandler 、+= RemoveHandler 演算子、-= 演算子などです。

4 の.NET Frameworkジェネリック デリゲート型には、バリアント型パラメーターを指定できます。 共変型パラメーターはデリゲートのパラメーター型として使用できます。また、戻り値の型として共変型パラメーターを使用することもできます。 この機能を使用すると、同じジェネリック型定義から構築されたジェネリック デリゲート型を、その型引数が継承リレーションシップを持つ参照型である場合に、代入互換性を持つものにできます。詳細については、「共変性と共変性」を参照してください。

注意

分散のために代入と互換性がある汎用デリゲートは、必ずしも組み合わせ可能であるとは限りません。 組み合わせ可能な型を使用するには、型が正確に一致する必要があります。 たとえば、 という名前のクラスが Derived 、 という名前のクラスから派生したとします Base 。 型 Action<Base> のデリゲート ( Visual Basic の場合) は、 型の変数に割り当てることができますが、型が正確に一致しないので、2 つのデリゲートを組み合わせ Action(Of Base) Action<Derived> することはできません。

呼び出されたメソッドが例外をスローした場合、メソッドは実行を停止し、例外はデリゲートの呼び出し元に返され、呼び出しリスト内の残りのメソッドは呼び出されません。 呼び出し元で例外をキャッチしても、この動作は変更されません。

デリゲートによって呼び出されたメソッドのシグネチャに戻り値が含まれる場合、デリゲートは呼び出しリスト内の最後の要素の戻り値を返します。 シグネチャに参照渡しされるパラメーターが含まれる場合、パラメーターの最後の値は、呼び出しリスト内のすべてのメソッドが順番に実行され、パラメーターの値が更新された結果です。

C のデリゲートに最も近いのは関数ポインターです。 デリゲートは、静的メソッドまたはインスタンス メソッドを表します。 デリゲートがインスタンス メソッドを表す場合、デリゲートはメソッドのエントリ ポイントへの参照だけでなく、クラス インスタンスへの参照も格納します。 関数ポインターとは異なり、デリゲートはオブジェクト指向であり、タイプ セーフです。

コンストラクター

Delegate(Object, String)

指定したインスタンス メソッドを指定のクラス インスタンスに対して呼び出すデリゲートを初期化します。

Delegate(Type, String)

指定したクラスから指定の静的メソッドを呼び出すデリゲートを初期化します。

プロパティ

Method

デリゲートによって表されるメソッドを取得します。

Target

現在のデリゲートがインスタンス メソッドを呼び出す対象のクラス インスタンスを取得します。

メソッド

Clone()

デリゲートの簡易コピーを作成します。

Combine(Delegate, Delegate)

2 つのデリゲートの呼び出しリストを連結します。

Combine(Delegate[])

デリゲートの配列の呼び出しリストを連結します。

CombineImpl(Delegate)

指定したマルチキャスト (組み合わせ可能) デリゲートと現在のマルチキャスト (組み合わせ可能) デリゲートの呼び出しリストを連結します。

CreateDelegate(Type, MethodInfo)

指定した静的メソッドを表すために、指定した型のデリゲートを作成します。

CreateDelegate(Type, MethodInfo, Boolean)

指定された静的メソッドを表す、指定された型のデリゲートを、バインドに失敗した場合の動作を指定して作成します。

CreateDelegate(Type, Object, MethodInfo)

指定された静的メソッドまたはインスタンス メソッドを表す、指定した型のデリゲートを、第 1 引数を指定して作成します。

CreateDelegate(Type, Object, MethodInfo, Boolean)

指定された静的メソッドまたはインスタンス メソッドを表す、指定した型のデリゲートを、第 1 引数およびバインドに失敗したときの動作を指定して作成します。

CreateDelegate(Type, Object, String)

指定したクラス インスタンスに対して呼び出す指定したインスタンス メソッドを表す、指定した型のデリゲートを作成します。

CreateDelegate(Type, Object, String, Boolean)

大文字と小文字の区別方法を指定して、指定したクラス インスタンスに対して呼び出す指定した型のデリゲートを作成します。

CreateDelegate(Type, Object, String, Boolean, Boolean)

大文字と小文字の区別方法およびバインドに失敗したときの動作を指定して、指定したクラス インスタンスに対して呼び出す指定した型のデリゲートを作成します。

CreateDelegate(Type, Type, String)

指定したクラスの指定した静的メソッドを表す、指定した型のデリゲートを作成します。

CreateDelegate(Type, Type, String, Boolean)

指定したクラスの指定した静的メソッドを表す、指定した型のデリゲートを、大文字と小文字の区別方法を指定して作成します。

CreateDelegate(Type, Type, String, Boolean, Boolean)

大文字と小文字の区別方法およびバインドに失敗したときの動作を指定して、指定したクラスの指定した静的メソッドを表す、指定した型のデリゲートを作成します。

DynamicInvoke(Object[])

現在のデリゲートが表すメソッドを動的に呼び出します (遅延バインディング)。

DynamicInvokeImpl(Object[])

現在のデリゲートが表すメソッドを動的に呼び出します (遅延バインディング)。

Equals(Object)

指定したオブジェクトと現在のデリゲートが同じ型を持ち、同じターゲット、メソッド、および呼び出しリストを共有しているかどうかを確認します。

GetHashCode()

デリゲートのハッシュ コードを返します。

GetInvocationList()

デリゲートの呼び出しリストを返します。

GetMethodImpl()

現在のデリゲートによって表される静的メソッドを取得します。

GetObjectData(SerializationInfo, StreamingContext)

サポートされていません。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
Remove(Delegate, Delegate)

一方のデリゲートの呼び出しリストから、最後に出現した他方のデリゲートの呼び出しリストを削除します。

RemoveAll(Delegate, Delegate)

一方のデリゲートの呼び出しリストから、そこに出現する他方のデリゲートの呼び出しリストをすべて削除します。

RemoveImpl(Delegate)

一方のデリゲートの呼び出しリストから、他方のデリゲートの呼び出しリストを削除します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

演算子

Equality(Delegate, Delegate)

指定したデリゲートが等しいかどうかを判断します。

Inequality(Delegate, Delegate)

指定したデリゲートが等しくないかどうかを判断します。

拡張メソッド

GetMethodInfo(Delegate)

指定したデリゲートによって表されるメソッドを表すオブジェクトを取得します。

適用対象

こちらもご覧ください