デリゲートはコールバックと同じものですか? それとも何らかの関係がありますか?
5 に答える
「コールバック」は、関数ポインターを持つ任意の言語で使用できるコーディング設計パターンを指す用語、または関数ポインターに類似したものです (これはデリゲートのようなものです)。
このパターンでは、関数へのポインタを別の関数に渡します。これにより、呼び出された関数内で、渡した関数を「コールバック」できます。このようにして、メソッドを呼び出すたびに異なる「コールバック」関数へのポインターを渡すことにより、メソッドの内部動作の大部分をメソッドの外部から制御できます...コールバックの例は、ソートアルゴリズムがある場合ですリスト内のオブジェクトの任意のペアを「比較」してソートし、どちらが優先されるかを判断する関数へのポインターを渡す必要があります。sort メソッドへの 1 回の呼び出しでは、オブジェクト名で比較するコールバック関数を渡し、別の時間ではオブジェクトの重みなどで比較する関数を渡します...
デリゲート (otoh) は、関数ポインターのシグネチャ固有のコンテナーとして機能する特定の .Net 型です。.Net マネージ コードでは、関数ポインターを作成して使用する唯一の方法はデリゲートです。したがって、.Net でコールバックを行うには、実際にはデリゲートを渡します... しかし、デリゲートはコールバック以外の他のシナリオでも使用できます。(具体的には、デリゲートを使用して、.Net スレッド プールからマルチスレッドを実装することもできます)
コールバックは、「オブザーバー」パターンを実装するためにも使用されます (イベントを使用して .Net で実装され、それ自体が特別なタイプのデリゲートです)。
(ここで.NETについて話していると思います。そうでない場合は、詳しく説明してください。)
デリゲートは、.NETでコールバックを実装する慣用的な方法ですが、そうする必要はありません。たとえば、インターフェイスを使用できます。(特に、エラー時に1つのメソッドを呼び出し、成功時に1つのコールバックをコールバックすることができます。もちろん、代わりに2つのデリゲートを使用することもできます...)
.NETのコールバック以外にも、デリゲートの用途はたくさんあります。これは、コールバックと見なすものによって異なりますが、LINQ to ObjectsのGUIイベントハンドラー、スレッドスターター、フィルター、プロジェクション(およびその他!)はすべてデリゲートを使用します。
それらは密接に関連しています。デリゲートは、コールバック関数がどのように見えるかについての説明です。
delegate void MyDelegate(string Text);
次に、コールバックをパラメーターとして受け取ることができる関数を作成できます。
//This will result in a MessageBox with "Lalalala"
MyFunctionThatGetsTheCallbackFunctionRef(MyCallBackFunc);
void MyFunctionThatGetsTheCallbackFunctionRef(MyDelegate TheFunction){
TheFunction("Lalalala");
}
void MyCallBackFunc(string Text){
//my callback
MessageBox.Show(Text);
}
一般的に、デリゲートは、メソッドを所有するオブジェクトの外部のメソッドにアクセスするために使用されるオブジェクトですが、コールバックは、デリゲートを保持する変数です。
C#では、これらの用語は同じ意味で使用されます
サービス クラスには、デリゲートと呼ばれる変数関数があります。呼び出し元のクラスには、コールバックと呼ばれる、実行したい優先関数があります。
呼び出し元のクラスは、デリゲートをそのコールバックに設定します。
デリゲートとコールバックの違いは視点です。サービス クラスは、呼び出しクラスのコールバックに設定されたデリゲートを呼び出します。