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
派生
属性
実装

注釈

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

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

手記

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

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

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

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

  • 仮パラメーター リストで公開されている非表示の this パラメーターを持つ型のインスタンス メソッド。 デリゲートは、開いているインスタンス デリゲートと言われます。

  • 静的メソッド。

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

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

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

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

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

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

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

手記

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

.NET Framework 4 以降では、ジェネリック デリゲート型にバリアント型パラメーターを指定できます。 反変型パラメーターはデリゲートのパラメーター型として使用でき、共変型パラメーターは戻り値の型として使用できます。 この機能を使用すると、同じジェネリック型定義から構築されたジェネリック デリゲート型は、その型引数が継承関係を持つ参照型である場合に割り当て互換性 共変性と反変性ので説明します。

手記

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

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

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

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

例については、「System.Delegate.CreateDelegateの補足 API 解説 参照してください。

コンストラクター

Delegate(Object, String)

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

Delegate(Type, String)

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

プロパティ

HasSingleTarget

Delegate に単一の呼び出しターゲットがあるかどうかを示す値を取得します。

Method

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

Target

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

メソッド

Clone()

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

Combine(Delegate, Delegate)

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

Combine(Delegate[])

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

Combine(ReadOnlySpan<Delegate>)

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

CombineImpl(Delegate)

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

CreateDelegate(Type, MethodInfo)

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

CreateDelegate(Type, MethodInfo, Boolean)

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

CreateDelegate(Type, Object, MethodInfo)

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

CreateDelegate(Type, Object, MethodInfo, Boolean)

指定した静的メソッドまたはインスタンス メソッドを表す、指定した型のデリゲートを作成します。最初の引数を指定し、バインドに失敗した場合の動作を指定します。

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[])

現在のデリゲートによって表されるメソッドを動的に呼び出します (遅延バインド)。

EnumerateInvocationList<TDelegate>(TDelegate)

このデリゲートの呼び出しターゲットの列挙子を取得します。

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)

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

適用対象

こちらもご覧ください