Каким образом вы используете делегаты и / или события, кроме как для пользовательского интерфейса? - PullRequest
4 голосов
/ 13 июля 2009

Мне любопытно, как другие разработчики используют делегаты и / или события, кроме как для ответа на события пользовательского интерфейса? Лично я не использую их ни для чего иного, кроме как для реагирования на события пользовательского интерфейса, но у меня есть сильное чувство, что я упускаю силу делегатов и событий. Поэтому я задаю этот вопрос SO-сообществу, чтобы я мог получить некоторые идеи о том, как я мог бы добавить эти инструменты в свой арсенал.

Ответы [ 4 ]

2 голосов
/ 13 июля 2009

В любом случае, когда вы слушаете события, которые могут появиться в любое время; например, при асинхронном прослушивании сокета, чтении файла XML и т. д.

1 голос
/ 13 июля 2009

События довольно обыденные. Чаще всего вы будете использовать их в ответ на пользовательский интерфейс или при разработке компонентов, которые должны информировать пользователей об изменениях состояния. Йон.

Делегаты, однако, полны круто и побеждают. Вероятно, наиболее распространенное использование в Linq. Linq повсюду использует лямбды, которые являются сокращёнными делегатами.

var numbers = new int[]{1,2,3,4,5};
var evenStevens = numbers.Where(x => x % 2 == 0);

Другое распространенное использование в многопоточности:

ThreadPool.QueueUserWorkItem(o => DoWork(o));

Где я использовал их, что мне больше всего нравится, в методах расширения HtmlHelper, которые смешивают рендеринг html с codebehind:

    /// <summary>
    /// Helps render a simple list of items with alternating row styles
    /// </summary>
    /// <typeparam name="T">The type of each data item</typeparam>
    /// <param name="html">The HtmlHelper.</param>
    /// <param name="rows">The list of items</param>
    /// <param name="rowTemplate">The row template.</param>
    /// <param name="evenCssClass">The even row CSS class.</param>
    /// <param name="oddCssClass">The odd row CSS class.</param>
    public static void SimpleList<T>(
        this HtmlHelper html,
        IEnumerable<T> rows,
        Action<T, string> rowTemplate,
        string evenCssClass,
        string oddCssClass)
    {
        var even = false;
        foreach (var row in rows)
        {
            rowTemplate(row, even ? evenCssClass : oddCssClass);
            even = !even;
        }
    }

пример его использования в файле aspx:

<div id="nodes" class="scrollingBlock">>
    <%  Html.SimpleList(
          Model.Nodes,
          (d, css) =>
          {%>
      <div class='<%=css%>'><%=d.Name %></div>
          <%}, "evenRow", "oddRow");%>
</div>
0 голосов
/ 13 июля 2009

Я использовал события для информирования некоторого управляющего класса о текущем состоянии в долго работающем приложении.

В моем случае я обновлял устройство Windows CE с помощью новой прошивки, и это могло занять до 15 минут, поэтому я сообщал бы контроллеру об обновлении строки и обновлял индикатор выполнения, вызывая другое событие. ,

Как уже упоминалось, если вам нужно знать, что происходит в другом потоке, события могут быть полезны, особенно если операция может занять значительное время.

0 голосов
/ 13 июля 2009

События идеально подходят для любого конечного автомата, который вы можете настроить. Вы запускаете отдельное событие для каждого изменения состояния, позволяя вашей программе реагировать на эти изменения.

Еще одно использование для события может дать вам знать, когда новая запись была проанализирована или загружена из какой-либо длительной задачи. Например, у вас может быть объект контроллера, который загружает большой XML-файл и анализирует записи из него. Этот контроллер может запускать событие каждый раз, когда он успешно анализирует новую запись из файла.

...