Как я Нерегистрирую 'анонимный' обработчик событий [дубликат]

=== оператор, как предполагается, выдерживает сравнение точный равенство содержания, в то время как == оператор сравнил бы семантическое равенство. В особенности это принудит строки к числам.

Равенство является обширным предметом. См. статья Wikipedia о равенстве .

37
задан P.K 28 August 2009 в 16:35
поделиться

6 ответов

If you need to unregister an event, I recommend avoiding anonymous delegates for the event handler.

This is one case where assigning this to a local method is better - you can unsubscribe from the event cleanly.

24
ответ дан 27 November 2019 в 04:19
поделиться

Give your instance of the anonymous delegate a name:

EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
    //some code
};

Subject.NewEvent += handler;
Subject.NewEvent -= handler;
42
ответ дан 27 November 2019 в 04:19
поделиться

Вы можете создать метод отмены регистрации для всех слушателей события. Это не совсем то, что вам нужно, но иногда это может быть полезно. Например (это действительно работает =)):

    class Program {
    static void Main(string[] args) {
        A someClass = new A();
        someClass.SomeEvent += delegate(object sender, EventArgs e) {
            throw new NotImplementedException();
        };

        someClass.ClearEventHandlers();
        someClass.FireEvent();

        Console.WriteLine("No error.");
    }

    public class A {
        public event EventHandler SomeEvent;

        public void ClearEventHandlers() {
            Delegate[] delegates = SomeEvent.GetInvocationList();
            foreach (Delegate delegate in delegates) {
                SomeEvent -= (EventHandler) delegate;
            }
        }

        public void FireEvent() {
            if (SomeEvent != null) {
                SomeEvent(null, null);
            }
        }
    }
}
6
ответ дан 27 November 2019 в 04:19
поделиться

Вам нужно отменить регистрацию по какой-либо причине, кроме утечки?

Что касается бита «Или просто разрешите утечку памяти», когда Subject очищается сборщиком мусора, ваш анонимный делегат также должен быть очищен, чтобы не было утечки.

0
ответ дан 27 November 2019 в 04:19
поделиться

Вам нужно имя для вашей анонимной функции, и тогда вы можете делать это только до тех пор, пока имя находится в scope:

    var handler = new EventHandler(delegate(object o, EventArgs e)
    {
        //do something...
    };

    Subject.NewEvent += handler;

    // later on while handler is still in scope...

    Subject.NewEvent -= handler;
2
ответ дан 27 November 2019 в 04:19
поделиться

Чтобы удалить обработчик при первом вызове:

//SubjectType Subject = ..... already defined if using (2)

EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
    // (1)
    (sender as SubjectType).NewEvent -= handler;
    // or
    // (2) Subject.NewEvent -= handler;

    // do stuff here
};

Subject.NewEvent += handler;
21
ответ дан 27 November 2019 в 04:19
поделиться
Другие вопросы по тегам:

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