メソッドまたは関数をデータとして渡す一般的なメソッドの便利な定義は次のとおりです。
- デリゲート
- 閉鎖
- 関数ポインタ
- 動的プロキシによる呼び出しと
- ファーストクラスの方法?
メソッドまたは関数をデータとして渡す一般的なメソッドの便利な定義は次のとおりです。
関数ポインタを使用すると、関数を変数のように渡すことができます。関数ポインターは基本的に、C/C++ などのファーストクラス メソッドをサポートしない言語で関数を渡すためのレガシー メソッドです。
ファーストクラスのメソッド基本的に、関数を変数のように渡すことができることを意味します。メソッドは (大まかに) 関数を意味します。したがって、これは基本的にファーストクラス関数を意味します。簡単に言えば、関数が変数のように「第一級市民」として扱われることを意味します。昔 (C/C++) では、関数を直接渡すことができず、関数ポインターなどの回避策に頼らなければならなかったため、関数は第一級市民ではないと言いました。
デリゲートは、第一級のメソッドに対する C# の答えです。デリゲートはクロージャーを含むため、やや強力です。次のコード スニペットを検討してください。
void foo( int a )
{
void bar() { writefln( a ); }
call( &bar );
}
void call( void delegate() dg ) { dg(); }
int main( char[][] args ) {
foo( 100 );
}
デリゲートはクロージャーを使用できるためbar
、ローカル変数を参照できることに注意してください。a
クロージャは、最初は非常に混乱する可能性があります。しかし、怠け者の定義は実にシンプルです。これは基本的に、人間が期待する方法で変数を使用できることを意味します。つまり、ソース コードの構造を読み取ることで、変数が存在するように見える場所で変数を参照できます。たとえば、上記のコード フラグメントを見てください。クロージャがなければ、別の関数であるに対してのみローカルであったため、はbar
参照できません。a
a
foo
bar
動的プロキシは奇妙なものです。これらの項目には属しません。それを説明するには、非常に長いテキストが必要です。これは、有名なProxy Patternに由来します。Proxy パターンの問題は、Proxy クラスがサブジェクトと同じインターフェイスを実装する必要があることでした。動的プロキシとは、基本的に、リフレクティブ アプローチを使用してサブジェクトのメソッドを発見し、ProxyPattern がサブジェクトのインターフェイスに結び付けられないようにすることを意味します。
クロージャはプログラミング言語の概念です。デリゲートは、MS.NET での実現です。
MS.NET のデリゲートは、オブジェクトのメソッドへの厳密に型指定されたポインターです (デリゲート インスタンスは、オブジェクトとそのメソッドの両方を指します)。複数の void デリゲート インスタンスを 1 つに結合する方法もあります。