2009-08-18 3 views
11

重複の可能性:
Delegate Usage : Business Applications
Where do I use delegates?ベストプラクティス:.NETで代理人を使用する必要があるのはいつですか?

こんにちは、

私は.NETのデリゲートの概念に新たなんだ - 私は実際にそれらをまだ使用していないと彼らはおそらく良い理由のためにそこにいると思う - いつ私が代議員を使用する必要がありますか?

例は大歓迎です。

+0

このような多くの類似の質問があります:http://stackoverflow.com/questions/31497/where-do-i-use-delegates –

+0

またはこの1つ:http://stackoverflow.com/questions/628803/delegate-usage-business-applications –

+0

またはこれ1つ:http://stackoverflow.com/questions/635015/when-would-i-use-a-delegate-in-asp-net –

答えて

4

代理人は、コードの別の部分を伝える必要があるときに便利ですどのように何かをするには。イベントは最も簡単な例です。イベント(何か起こったこと)をからどのように分離するかは、です。他の例としては、カスタム検索など、いくつかの一般的な繰り返し演算、以下のとおりです。

List<Foo> foos = new List<Foo>(); 
foos.Find(delegate(Foo foo) 
    { 
     if(foo.CustomProperty.Contains("special value")) 
     { 
      return false; 
     } 
     return true; 
    }); 

上記は完全に任意の例ですが、あなたは何(の基準を「見つける」反復して実行)を分離することができますポイントになりますから、 how(何かが見つかったかどうかを判断する方法)

2

Events舞台裏で代議員を使用します。

イベントを使用している場合は、代理人を使用していますが、より良い構文を使用しています。

基本的には、コールバックまたはイベントベースのプログラミング用です。

2

イベント駆動型プログラミングでは、代理人が使用されます。ベスト・プラクティスは、しばしばコードのデカップリング(または「緩い結合」)に関するものです。デリゲートを使用すると、何かが起きたときにXを呼び出すのではなく、イベントにメソッドをサブスクライブすることができます。

8

代理人は、の動作をパラメータとして渡す方法を提供します。

一般的な例は、オブジェクト以外のものがあなたのオブジェクトを呼び出す責任があるイベントと非同期プログラミングです。そのイベントにデリゲートを提供すると、そのデリゲートに関連付けられた動作を実行できるようになります。

これは、一般的なアルゴリズムを実装する場合にも便利なテクニックです。私は非常に似ている複数の方法を書いています。おそらく同じデータセットをループするかもしれませんが、少しずつ異なるタスクを実行します。単一の関数にデリゲートを渡してそのタスクを実行し、そのデリゲートをデータのループ内から呼び出すことができます。このようにして、データのループを複数回実装する必要はなく、新しいことを行う新しいコードを書くだけでよく、一般的な動作はすべて共通の方法で行われます。

コメントへの返信

ループ内からデリゲートを呼び出し、ループ内からメソッドを呼び出すとの違いは、デリゲートはループが含まれている関数のパラメータであるということです。これは、特定のメソッド内で定義されているものだけでなく、その関数が何かを行うことができることを意味します。このような柔軟性は、アルゴリズムが果たしていることの詳細とは完全に独立したライブラリ内の汎用アルゴリズムを供給することができます。 Linqは、代理人の柔軟性によって許される一般性の良い例です。

+0

あなたの答えは私のために少し曖昧です。ループを使ってデリゲートを呼び出すことと、そのループの中から簡単なメソッドを呼び出すことの違いは何ですか? –

2

Events and Callbacksの.NETガイドラインでは、この点について説明しています。

要約すると、強力なIDEサポートがあり、ほとんどの開発者がイベントに慣れているため、単純なAPIのイベントを優先する必要があります。ただし、実行するコードをユーザーに提供する必要がある場合は、代理人または仮想メンバーの使用を検討する必要があります。コールバックのパフォーマンスは低下しますが、ActionFuncなどの代理人を使用する場合は、ラムダを許可します。

3

また、独自のデリゲートタイプを使用する代わりに、汎用デリゲートタイプを使用することをおすすめします。以下の実施例:
Func< TResult>
Func< T1, T2, TResult>
のFuncなど

EventHandler< TEventArgs> ...
Action< T1>
Action< T1, T2>
アクション等...

+1

Aaron-それは良い点です。フレームワーク設計ガイドラインでは、カスタムデリゲートの作成を避けるべきだと述べています。http://blogs.msdn.com/brada/archive/2009/01/26/framework-design-guidelines-avoiding-custom-delegates.aspx – RichardOD

1

例の場合:単一のリソースは、複数のオブジェクトによって使用されています。リソースにはこれらのオブジェクトへの非同期コールバックが必要ですが、リソースの性質上、1つの要求のみが特定の時間にアクティブであることが要求され、その要求は特定のオブジェクトに関連付けられています。アーキテクチャのせいで、私はオブジェクトをリソースに渡したくないので、代わりにリソースに各オブジェクトのデリゲートを送り、オブジェクト識別子とともにこれらのデリゲートを格納します。リクエストが行われると、対応するオブジェクト識別子を検索し、その特定のデリゲートを呼び出すことができます。

私はもともとイベントでこれを実装しましたが、特定のオブジェクトでイベントを「目標」にすることができなかったため、問題が発生していました。私はこれがベストプラクティスであるかどうかはわかりませんが、私にとってはうまくいくようです。

関連する問題