3

重複の可能性:
いつ、なぜデリゲートを使用するのですか?

私は C# 構文のほとんどを理解しており、デリゲートについては部分的に理解していますが、デリゲートを使用する必要があるケースが見つかりません。

いくつかの例を使用して、ソフトウェア開発における彼らの位置を理解するのを手伝ってもらえますか? とてもうれしくなる。ありがとうございました。

4

2 に答える 2

1

デリゲートは、コードプロバイダーとコードコンシューマーの間の相互の義務を表現するもう1つの方法です。

これは、「2つのintを追加して2つのintを返すことができる人が必要です」と「ねえ、私はメソッドであり、2つのintを追加してintを返すことができます。あなたは私を使用できます」のようなものです。

遠い観点からすると、「デリゲートが必要な理由」を尋ねるのは、「インターフェイスが必要な理由」を尋ねるようなものです。「クラスコントラクト」を表現する代わりに、「メソッドコントラクト」を表現します。

興味深いのは、デリゲートで処理されるほとんどのケースはインターフェースで処理でき、その逆も可能であるということです。C#を使用すると、2つのメカニズムをより柔軟に選択できるようになります。たとえば、義務がインターフェースを使用して表現されるJavaには、そのような柔軟性はありません。

于 2012-08-10T16:34:32.810 に答える
1

デリゲートの 1 つの機能は、関数ポインターとして機能することです。私が作成しなければならなかったプログラムの場合、同様の関数を実行し、それらを配列スタイルで呼び出す必要がありました。

たとえば、いくつかの機能があるとします。

double play(int data1, int data2)
double work(int x, int y)

この二人は同じサインです。どちらも double を返し、どちらも 2 つの int を取ります。デリゲートで呼び出すことができます

delegate double myFunctions(int a, int b);

したがって、同じ関数から「再生」と「作業」を実行する必要があるとしましょう。私はこのようにすることができます:

public void do_something( myFunctions action, String information)
{
   int input1;
   int input2;
   /*
     Lets say the string was.... the dimensions of a rectangle expressed as 5x8
     here we parse the string so...

     information is "5x8:
     set input1 to 5
     set input2 to 8
   */

   //then run the function that was passed in.
   action(input1, input2);
}

そして、この関数を次のように呼び出します。

do_something(play, "5x8");
//or
do_something(work, "484x237");

そして、コメント領域には、これが些細な例ではないと私が思うものがあります。基本的に、少なくともこのコンテキストでは、プログラムのモジュール化に役立ちます。

于 2012-08-10T16:48:47.720 に答える