9

メソッドまたは関数をデータとして渡す一般的なメソッドの便利な定義は次のとおりです。

  • デリゲート
  • 閉鎖
  • 関数ポインタ
  • 動的プロキシによる呼び出しと
  • ファーストクラスの方法?
4

3 に答える 3

14

関数ポインタを使用すると、関数を変数のように渡すことができます。関数ポインターは基本的に、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参照できません。aafoobar

動的プロキシは奇妙なものです。これらの項目には属しません。それを説明するには、非常に長いテキストが必要です。これは、有名なProxy Patternに由来します。Proxy パターンの問題は、Proxy クラスがサブジェクトと同じインターフェイスを実装する必要があることでした。動的プロキシとは、基本的に、リフレクティブ アプローチを使用してサブジェクトのメソッドを発見し、ProxyPattern がサブジェクトのインターフェイスに結び付けられないようにすることを意味します。

于 2009-06-06T20:24:50.337 に答える
0

クロージャはプログラミング言語の概念です。デリゲートは、MS.NET での実現です。

MS.NET のデリゲートは、オブジェクトのメソッドへの厳密に型指定されたポインターです (デリゲート インスタンスは、オブジェクトとそのメソッドの両方を指します)。複数の void デリゲート インスタンスを 1 つに結合する方法もあります。

于 2009-06-05T13:42:05.097 に答える