4

私は代表者の進化を理解しようとしていました。そして、これは、その前に何が起こったのかを理解することよりも、どのように最もよく理解できるでしょうか?デリゲートの概念は、C++の関数ポインターから来ていることを理解しています。

1.関数ポインタを導入する主な理由は何ですか?マルチスレッドをサポートするためですか?

Henk Holterman:あるレベルの柔軟性を提供するために、デリゲート/関数ポインターが存在します。メソッドの選択は、その呼び出しから切り離すことができます。

この素晴らしいスレッドリソースを見ながら、私は代表者に紹介されました

http://www.albahari.com/threading/

これは、JoeAlbahariが非同期デリゲートについて言わなければならないことです。

ThreadPool.QueueUserWorkItem実行終了後にスレッドから戻り値を取得するための簡単なメカニズムは提供されていません。非同期デリゲート呼び出し(略して非同期デリゲート)はこれを解決し、任意の数の型指定された引数を双方向に渡すことができます。さらに、非同期デリゲートでの未処理の例外は、元のスレッド(より正確には、を呼び出すスレッドEndInvoke)で便利に再スローされるため、明示的な処理は必要ありません。

*2。すべてのデリゲートは本質的に非同期ですか?

Jon:デリゲートはコードへのポインターです。本質的に同期でも非同期でもありません。それが呼び出され、返される結果がそれを決定する方法。

Henk Holterman:デリゲートインスタンスfがある場合、同期的にf()を呼び出すか、非同期のf.BeginInvoke()を呼び出すことができます。

  1. イベント以外の非同期デリゲートの使用法はありますか?

dasblinkenlight : .NET非同期I / Oなど、非同期APIではデリゲートの多くの用途があります。

  1. C#でのデリゲート/スレッドのサポートはバージョン間でどのように進化しましたか?
    *

dasblinkenlight:デリゲートのコアサポートは同じままでしたが、言語はデリゲートの定義をより便利にするために多くの重要な機能を追加しました。

C#2.0:匿名デリゲートの導入
C#3.5:ラムダ式を追加
C#4.0:タスク並列ライブラリを追加。

編集:ここでの私の質問のほとんどは明確にされています。代表者の「歴史」ともっと実用的な使い方ができたらいいなと思います!

4

4 に答える 4

4

いくつか試してみましょう:

1)あるレベルの柔軟性を提供するために、デリゲート/関数ポインターが存在します。
これらを使用すると、メソッドの選択をその呼び出しから切り離すことができます。

2)デリゲートインスタンスがある場合fは、同期的 に呼び出すf()ことも、非同期的に呼び出すこともできますf.BeginInvoke()

3)はい、たくさんあります。また、イベントは通常、同期的に呼び出されます。

4)それはそれらを理解するのに関連していますか?

于 2012-09-18T11:51:07.077 に答える
4
  1. デリゲートを導入する主な理由は、実行可能コードのスニペットを操作するためのメカニズムを提供することです。これには、ポインターの格納、関数への受け渡し、データ構造の整理などがあります。

  2. すべての関数呼び出しと同様に、個々のデリゲートの呼び出しは同期的です。つまり、呼び出し元はデリゲートが完了するまで待ってからコントロールを取得する必要があります。ただし、デリゲートを使用して、後で (非同期的に) 格納および実行できるコードを渡すことで、非同期 API を実装できます。

  3. .NET Asynchronous I/Oなど、非同期 API でのデリゲートの使用は多数あります。

  4. デリゲートのコア サポートは同じままですが、デリゲートの定義をより便利にするために、言語には多くの重要な機能が追加されました。たとえば、C#2.0 では匿名デリゲートが追加され、C#3.5 ではラムダが追加されました。

于 2012-09-18T11:53:19.487 に答える
0

1.関数ポインタの主な用途は、他の関数やコールバック関数への引数としての2つの関数をサポートすることであり、マルチスレッドではないと思います。

2.すべてのデリゲートは本質的に非同期ではなく、前述の記事のように非同期を実行するにはスレッドで使用する必要があります

3.有名な使用法の1つは、Lambda式とLINQ、コールバック、開始スレッド、イベント処理です。

4.基本的にデリゲートは関数ポインタメカニズムから使用していると思います

于 2012-09-18T12:01:55.737 に答える