0

この記事http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspxから C# でデリゲートを学習しようとしています 。

私はコードを少し理解できますが、開発者がデリゲートを使用する場所と理由を理解できません。誰かがデリゲートから始めるのに役立つ簡単なシナリオを教えてもらえますか?

更新 私はどこでもこのステートメントを読みました。

しかし、私が渡す関数についてコンパイラーが認識しないようにしたいのはなぜですか? ここで抽象化の匂いがしますが、何の役に立つのでしょうか? 任意のリアルタイム シナリオが必要です。

4

4 に答える 4

1

ほら、Windowsフォームには、button、image、textboxなどのクラスがあります...それらはすべて、button.click、textbox.texchange、...などのイベントハンドラーを持っています。これらはそれ自体がデリゲートです。ボタンクリックで何かをしたいときは、voidで、オブジェクトタイプとEventArgsの2つの引数を持つ関数を記述します。そのボタンクラスを書いた人は、ボタンクリックで何をすべきかを知りませんでしたが、あなたに委任を与えました:

public delegate EventHandler Click;

次のような定義済みのメソッドはどこにありますか。

public void mymethod(object s, EventArgs e)

または、すべてのメソッドthaは無効であり、そのパラメータがあります

于 2012-05-31T10:05:25.730 に答える
1

デリゲートを使用する良い例は、コールバックです。クラスDbSearcherがあるとします。そのクラスにはSearch(string q)メソッドがあり、このメソッドを呼び出すと、戻るのに 1 分かかります。最終的には検索結果を表示したいが、それ以上何もできない状態で表示されるまでユーザーを待たせたくはありません。メソッドをたとえばSearch(string q, Action displayResults)に変更し、別のスレッドで起動します。ここでのdisplayResultsは、検索結果がデータベースから取得されたときに Search メソッド内で呼び出すデリゲートです。

于 2012-05-31T10:11:42.960 に答える
0

ウェブ上で非常に多くの例とコード スニペットを見つけることができます。これが私の例です。ユーザーが次の操作でどの操作を行うかを決定するとします。

  1. 2 つの数字を足す
  2. 2 つの数を減算します。
  3. 複数の 2 つの数字
  4. 2 つの数を割ります。

しかし、これらすべてを実行する共通の方法が 1 つあります。

Operation(some delgate method)
{
   // do some operation
}

u ユーザーの選択に基づいて、実行時にデリゲートを渡すことができます。

これはほんの一例です。

于 2012-05-31T10:13:09.520 に答える
0

デリゲートは基本的にメソッドへの参照です。

たとえば、文字列を変更するためにさまざまな方法が必要になる場合があります。

public static string ChangeOne(string s) {
  return s.TrimStart();
}

public static string ChangeTwo(string s) {
  return s.TrimEnd();
}

いくつかの基準に応じて、それらの中から選択し、その選択をデリゲートに入れることができます。

Func<string, string> change;
if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday) {
  change = ChangeOne;
} else {
  change = ChangeTwo;
}

次に、デリゲートを通常のメソッドとして使用できます。それを使用するコードは、メソッドが何をするか、またはその理由を知る必要はありません。

string x = "  asdf  ";
x = change(x);

デリゲートは、たとえば、ライブラリ メソッドがコレクション内のオブジェクトについて何も知る必要がない一般的なコレクションに広く使用されます。関連情報を選択するメソッドへのデリゲートを提供するだけです。

ここでは、Whereメソッドはリスト内のオブジェクトについて何も認識せず、オブジェクトを結果に含めるかどうかを決定するメソッドへのデリゲートのみを取得します。

IEnumerable<obj> older = listOfObj.Where(o => o.Age >= 18);
于 2012-05-31T10:15:29.360 に答える