Как удалить событие? - PullRequest
3 голосов
/ 08 июля 2011

для образца ....

SampleClass:

public class SampleClass
{
    public delegate void BeforeEditorHandle();
    public event BeforeEditorHandle OnBeforeEditor;
}

MainMethod

    static void Main(string[] args)
    {
        SampleClass sc = new SampleClass();
        // Add Event
        sc.OnBeforeEditor +=new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);
        // Remove Event
        sc.OnBeforeEditor -= new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);

    }

И, если я добавлю событие по динамике, как это ... ↓

sc.OnBeforeEditor += () => {  };

Должен ли я удалить событие, как ↓

sc.OnBeforeEditor -= () => {  }; 

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

Ответы [ 3 ]

8 голосов
/ 08 июля 2011

Вы можете назначить обработчик события / лямбду переменной, которую вы затем можете подписать и отписаться:

var myHandler = () => {  };

sc.OnBeforeEditor += myHandler;

sc.OnBeforeEditor -= myHandler;
6 голосов
/ 08 июля 2011

Я почти уверен, что ваш код здесь не будет работать:

И, если я добавлю событие динамически, как это ... ↓

sc.OnBeforeEditor += () => {  };

СледуетЯ удаляю событие как ↓

sc.OnBeforeEditor -= () => {  };

Это потому, что перезапуск лямбды создает новую другую лямбду.

Вам нужно сохранить старую ссылку и использовать ее для отмены подписки:

BeforeEditorHandle myHandler=() => {  }
sc.OnBeforeEditor += myHandler;

...
sc.OnBeforeEditor -= myHandler;

Для упрощения отписки вы можете собирать обработчики событий в коллекцию (например, List<BeforeEditorHandle>).

2 голосов
/ 08 июля 2011

С MSDN :

Важно отметить, что вы не может легко отписаться от событие, если вы использовали анонимный функция подписки на него. к отписаться в этом сценарии, это необходимо вернуться к коду где Вы подписываетесь на событие, хранить анонимный метод в делегате переменной, а затем добавьте делегат событие. В общем, мы рекомендуем что вы не используете анонимный функции подписки на события, если вам придется отписаться от событие в какой-то более поздний момент в вашем код. Для получения дополнительной информации о анонимные функции, см. Аноним Функции (Руководство по программированию в C #).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...