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