C# - анонимные функции и обработчики событий

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

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

22
задан splattne 23 May 2012 в 11:21
поделиться

3 ответа

Ветви предназначены для изоляции «усилий по разработке» (здесь некоторые настройки), которые не могут быть выполнены в тех же текущих ветвях.
Поскольку тег предназначен для ссылки на «неизменяемый» контент, вам не следует делать в нем никаких изменений. Простого:

 cvs tag -r MY_TAG -b MY_BRANCH

будет достаточно для инициализации ветки из тега ветки.

Эти ветки должны выполняться для каждого цикла UAT (пользовательского приемочного теста), начиная с вашей текущей разработки. Затем вы можете:

  • либо попытаться объединить содержимое предыдущей ветки, сделанной для предыдущей демонстрации для клиента, в эту новую ветку
  • , либо напрямую повторно реализовать настройки в новой ветке.
  • оставить эти ветки. как они есть, когда цикл UAT завершен. Они не будут изменены, но могут служить справочными материалами для следующих ветвей следующего цикла.

Попытаться сохранить ветку с настройкой будет сложнее, чем воссоздать указанные эволюции в новой ветке: а затем удалите обработчик внутри блока finally (необходимо в случае, если обработчик выдает исключение):

  public List<IWFResourceInstance> FindStepsByType(IWFResource res)
  {
     List<IWFResourceInstance> retval = new List<IWFResourceInstance>();
     EventHandler<WalkerStepEventArgs> handler = (sender, e) =>
     {
        if (e.Step.ResourceType == res) retval.Add(e.Step);
     };

     this.FoundStep += handler;

     try
     {
        this.Start();
     }
     finally
     {
        this.FoundStep -= handler;
     }

     return retval;
  }

В C # 7.0+ вы можете заменить анонимный делегат локальной функцией, достигнув того же эффекта:

    public List<IWFResourceInstance> FindStepsByType(IWFResource res)
    {
        var retval = new List<IWFResourceInstance>();

        void Handler(object sender, WalkerStepEventArgs e)
        {
            if (e.Step.ResourceType == res) retval.Add(e.Step);
        }

        FoundStep += Handler;

        try
        {
            this.Start();
        }
        finally
        {
            FoundStep -= Handler;
        }

        return retval;
    }
40
ответ дан 29 November 2019 в 04:06
поделиться

Нет, он не будет удален автоматически. В этом смысле нет разницы между анонимным методом и «обычным» методом. Если хотите, вы должны вручную отказаться от подписки на событие.

Фактически, оно захватит и другие переменные (например, res в вашем примере) и сохранит их активность (предотвращает их сбор сборщиком мусора).

5
ответ дан 29 November 2019 в 04:06
поделиться

При использовании анонимного делегата (или лямбда-выражения) для подписки на событие не позволяет вы можете легко отказаться от подписки на это событие позже. Обработчик событий никогда не отменяется автоматически.

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

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

По этим причинам, если вам придется отказаться от подписки на событие в какой-то более поздний момент, не рекомендуется использовать анонимных делегатов. См. Как подписаться на события и отказаться от подписки (Руководство по программированию на C #) (в частности, раздел под названием «Подписка на события с помощью анонимного метода»).

(Это может быть, а может и не быть тем, что вы намереваетесь.)

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

По этим причинам, если вам придется отказаться от подписки на событие в какой-то более поздний момент, не рекомендуется использовать анонимных делегатов. См. Как подписаться на события и отказаться от подписки (Руководство по программированию на C #) (в частности, раздел под названием «Подписка на события с помощью анонимного метода»).

(Это может быть, а может и не быть тем, что вы намереваетесь.)

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

По этим причинам, если вам придется отказаться от подписки на событие в какой-то более поздний момент, не рекомендуется использовать анонимных делегатов. См. Как подписаться на события и отказаться от подписки (Руководство по программированию на C #) (в частности, раздел под названием «Подписка на события с помощью анонимного метода»).

После этого вы сможете удалить делегата из события до выхода из функции.

По этим причинам, если вам придется отказаться от подписки на событие в какой-то более поздний момент, не рекомендуется использовать анонимных делегатов. См. Как подписаться на события и отказаться от подписки (Руководство по программированию на C #) (в частности, раздел под названием «Подписка на события с помощью анонимного метода»).

После этого вы сможете удалить делегата из события до выхода из функции.

По этим причинам, если вам придется отказаться от подписки на событие в какой-то более поздний момент, не рекомендуется использовать анонимных делегатов. См. Как подписаться на события и отказаться от подписки (Руководство по программированию на C #) (в частности, раздел под названием «Подписка на события с помощью анонимного метода»).

2
ответ дан 29 November 2019 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: