Какие новые функции доступны через делегатов и события в C # 3? - PullRequest
0 голосов
/ 10 марта 2009

Мне кажется, что я не использую все функции делегатов / событий, доступные в .NET 3.5 и более поздних версиях. И более или менее все еще используя делегатскую власть, доступную в 2.0. Буду признателен, если вы скажете мне, как делегаты / события должны использоваться сейчас, трюки, ярлыки.

Спасибо.

EDIT

Джон предложил свою публикацию на эту тему, и я публикую здесь для облегчения навигации:

Несколько моих статей, которые могут быть актуальны:

В моей книге C # in Depth есть целая глава, посвященная делегатам (глава 5). К сожалению, это не одна из бесплатных: (

пс. Я не смог найти дубликат этого вопроса, но просмотрел многие на эту тему.

Ответы [ 3 ]

6 голосов
/ 10 марта 2009

Несколько моих статей, которые могут быть актуальны:

Моя книга, C # в глубине , имеет целую главу, посвященную делегатам (глава 5). К сожалению, это не одна из бесплатных: (

Основные изменения в резюме (как сказал Джаред, это языковые изменения - сам .NET не сильно изменился, за исключением того, что он стал универсальным, а среда, предоставляющая удобные делегаты Func и Action):

C # 2:

  • Преобразование групп методов:

    // Old:
    button.Click += new EventHandler(HandleClick);
    // New:
    button.Click += HandleClick;
    
  • Анонимные методы:

    button.Click += delegate { Console.WriteLine("Click!"); };
    
  • ковариации / контрвариантность:

    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);
    
1 голос
/ 10 марта 2009

Рассматривали ли вы использование делегатов для быстрых и грязных асинхронных операций? Вы можете вызвать методы 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);
1 голос
/ 10 марта 2009

Делегаты не изменились вообще 2.0 -> 3.5. Что изменилось, так это множество предметов вокруг них

  1. В System.Core.dll (наконец-то) добавлены делегаты многократного использования в форме Func <> и Action <>
  2. C # и VB получили немного функционального вкуса с лямбда-выражениями. Это дало языкам очень сжатый синтаксис для выражения операции делегата. В C # были анонимные методы в 2.0, но они просто не сравниваются с лакондными выражениями в лаконичной природе

     list.Where(x => x > 42);
  3. LINQ в своих основах предоставляет серию API, которые работают исключительно на делегатах.

Так что действительно, делегетаза не изменилась, только ее использование.

...