2011-04-05 12 views
2

単純なデリゲートは関数をポイントし、後でデリゲートを呼び出すとマップされた関数が呼び出されます。単純なデリゲートの使用

私はほとんどdelegate.soを使用していません。なぜ、単純なデリゲートを使用するのかを知りたいだけです。ここで私は使用デリゲートのサンプルコードを提供しています。上記の例では

using System; 
using System.Windows.Forms; 

delegate void DisplayMessage(string message); 

public class TestCustomDelegate 
{ 
    public static void Main() 
    { 
     DisplayMessage messageTarget; 

     if (Environment.GetCommandLineArgs().Length > 1) 
      messageTarget = ShowWindowsMessage; 
     else 
      messageTarget = Console.WriteLine; 

     messageTarget("Hello, World!"); 
    } 

    private static void ShowWindowsMessage(string message) 
    { 
     MessageBox.Show(message); 
    } 
} 

デリゲートだけ関数を指し、我々は、デリゲートを呼び出すときに関数がマッピングされると呼ばれます。ここで関数を直接呼び出すことができます。なぜ、代理人を使用する必要があるのですか?代議員の優位性を説明する良いサンプルで説明してください。私の上記のプログラムでは、ShowWindowsMessage関数を直接呼び出すことができ、デリゲートは必須ではありません。

おかげ

答えて

3

基本例:

比較機能に代理人を渡すことができます。
この場合、コレクションを並べ替えることはできますが、ソート方法はまだ分かりませんが(もちろんデフォルトがあります)、将来決定される関数を使用できるようにしたい日付。

したがって、代理人を使用して関数を引数として渡すと便利です。あなたの非常に単純な例では

List.Sort Method (Comparison)

+1

これは、一般的に戦略パターンと呼ばれています。代表者を使用する完全な例です。 – MattDavey

1

私はあなたがfirst-class functions、およびclosuresに慣れることをお勧め。その後、どのようにeventsがCで使用されるのですか

また、プログラムの引数には、mainメソッドに追加することでアクセスできます。

public static void Main(string[] args) 
{ 
    DisplayMessage messageTarget; 

    if (args.Length > 1) 
     messageTarget = ShowWindowsMessage; 

    // ... 
1

は、例えば、私はこのようなコードを持っている:TInput oがnullの場合は

public static class MemberEvaluator 
{ 
    public static TResult With<TInput, TResult>(this TInput o, 
               Func<TInput, TResult> evaluator) 
     where TResult : class 
     where TInput : class 
    { 
     if (o == null) return null; 
     return evaluator(o); 
    } 
} 

を、これがnullのチェックをスキップすると便利です、それだけでnullを返し、例外をスローしません私はどこでも2行のコードを書くことができますが、これが必要なプロジェクトで作業するときは、単純な関数を使用する方が良いでしょう。x.With(q=>q.Z)で呼び出すと、ヌルチェックなしでx.q.Zが得られます。 q=>q.Zは非常に良い使い方を持つ単純なデリゲートです。実際には私のチェッカー機能の入力としてFunc<TInput, TResult> evaluatorです。

編集:これは、オブジェクトのメンバーを評価する1つの拡張メソッドを持つ拡張クラスです。フルコードhereを見つけることができます。

+0

を見つけたあなたの答えに感謝しますが、あなたのコードは、あなたが言おうとしても理解することは非常に厳しいされたかを理解するには、完全なコードではありませんしました。完全なコードを教えてください。ありがとう – Thomas

+0

@トーマス、私は答えを編集しました。 –

1

は明らかにあなたが

MSDNは、.NETフレームワークに関する多くの情報が含まれているを実現してきたように代表者のための必要はありません。周囲のクイック検索は、ほとんどの.netの質問に対する答えを思いつくことがあります。

私はあなたのために検索し、この..

http://msdn.microsoft.com/en-us/library/ms173171%28v=VS.100%29.aspx