2009-03-10 5 views
0

私は、.NET 3.5以降で利用可能な代理人/イベントのすべての機能を利用していないと感じています。そして、多かれ少なかれ、デリゲートのパワーを2.0で利用可能にしています。デリゲート/イベントをどのように使うべきか、トリック、ショートカットを教えていただければ幸いです。C#3のデリゲートとイベントから、どのような新機能を利用できますか?

ありがとうございました。

EDIT

ジョンはこの主題に彼の出版を提案し、私は簡単にナビゲーションのためにここに掲示しています:

関連するかもしれない、私の記事の数:

私の本、深さのC#が、代表団(第5章)に専念し、全体の章があります。 。残念ながら、それは私がこの質問の重複を見つけることができなかったが、このテーマに多くの目を通すでした

PS無料のもの:(の一つではありません

答えて

6

関連するかもしれない、私の記事のいくつかは:。

私の本、C# in Depth、代表団(第5章)に専念し、全体の章があります。残念ながらそれは無料のものの一つではありません:(

要約の主な変更点(Jaredが言ったように、これらは言語の変更です - 。)NET自体は、一般的ななってきて、それらを超えてあまり変わっていない、とフレームワークは、便利なFuncActionデリゲートを供給:

C#2:

  • メソッドグループの変換:

    // Old: 
    button.Click += new EventHandler(HandleClick); 
    // New: 
    button.Click += HandleClick; 
    
  • を匿名の方法:

    button.Click += delegate { Console.WriteLine("Click!"); }; 
    
  • 共分散/ contravariance:

    EventHandler generalHandler = LogEvent; 
    button.Click += generalHandler; 
    button.KeyPress += generalHandler; // Event type is KeyPressEventHandler 
    

C#3:

  • ラムダ式:

    button.Click += (sender, args) => Console.WriteLine("Click!"); 
    

    以上重要:

    var people = list.Where(person => person.Name != "Jon") 
           .OrderBy(person => person.Age); 
    
+0

;) –

+0

まあ、依存 - ティーザー章では、誰かが本を買うために取得するのに十分になってしまった場合... –

+0

@ジョンスキート、おかげで、私はすべてを持っています彼らは一回以上プリントアウトして読む...暗いコーナーを見て....ダーク!!!! –

1

参加者はまったく変わらない2.0 - > 3.5。何が変わったことはSystem.Core.dll(最終的には)のFunc < >とアクション< >

  • C#とVBの形で再利用可能な代表者を彼らの周りのアイテム

    1. の多くを加えてのビットを得ましたラムダ式の機能的なフレーバー。これにより、言語は代理操作を表現するための非常に簡潔な構文になりました。 C#が2.0で匿名メソッドを持っていたが、ラムダのsuccint性質が代表者に、純粋で動作するAPIのシリーズを公開することの基盤に

       list.Where(x => x > 42);
    2. LINQを表現して彼らは比較しません。

    だから、本当にdelegetaseは変更されていません。

  • +0

    ああそう...これは素晴らしいですが、私はすでにこれを知っている、それを使用しないでください... –

    1

    すばやく非同期操作の代理人を使用することを検討しましたか? BeginInvokeメソッドとEndInvokeメソッドを呼び出して、ThreadPoolで非同期操作を実行できます。

    *米国*あなたは意味のために不幸
    // Definition. 
    delegate string TransformDelegate(string input); 
    
    // Client code. This is some lengthy operation. You can also 
    // assign a function here if you want. 
    TransformDelegate t = (x) => ...; 
    
    // Begin invoking. 
    t.BeginInvoke("input", (ar) => 
    { 
        // Call end invoke. 
        string result = t.EndInvoke(ar); 
    
        // Dispose of wait handle, known issue documented here. 
        // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=94068 
        using (IDisposable d = ar.WaitHandle) { } 
    
        // Process end result here. Remember, on another thread now. 
    }, null);