BadCats
@BadCats

Открепление лямбда метода от события?

Всем привет, прохожу курс по c#

имеется строка:
// Невозможно открепить ранее присоединенный анонимный метод.
            instance.MyEvent -= delegate { Console.WriteLine("Анонимный метод 1."); };

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

Возникает вопрос:

1) почему не срабатывает вышеприведенный метод открепления лямбда метода?

2) как открепить лямбда метод?

3)Если открепить лямбда метод не так просто, то можно ли (я не помню точно принимает ли лямбда метод параметры в конструктор) в его конструктор передать вызов например какого-нибудь другого обычного , например созданного нами "зловредного" метода(который будет делать какую-то пакость), который будет вызываться на это событие - через лямбда метод - вызываемый этим событием? Например при событии - "нажатие мышкой" (написанного нами а не готовым(стандартным) если таково имеется) - через лямбда метод вызвать какой-то "зловредный метод".
  • Вопрос задан
  • 275 просмотров
Пригласить эксперта
Ответы на вопрос 4
stackoverflow.com/questions/183367/unsubscribe-ano...
Action myDelegate = delegate(){Console.WriteLine("I did it!");};

MyEvent += myDelegate;


// .... later

MyEvent -= myDelegate;


Но луче послушать этого мужика:
"From memory, the specification explicitly doesn't guarantee the behaviour either way when it comes to equivalence of delegates created with anonymous methods.

If you need to unsubscribe, you should either use a "normal" method or retain the delegate somewhere else so you can unsubscribe with exactly the same delegate you used to subscribe."
Jon Skeet
Ответ написан
@Madfisht3
Для события только += или -=; Это для того и делается, чтобы защитить от шаловливых рук, чтобы не смогли извлечь из события и запускать вручную то, что привязано к событию.
И еще:
Action m1 = delegate { Console.WriteLine("Анонимный метод 1."); };
Action m2 = delegate { Console.WriteLine("Анонимный метод 1."); };
 m1 == m2 //False
Ответ написан
Комментировать
Я знаю два варианта, слабые ссылки или хранение и отписка.
Ответ написан
Комментировать
yarosroman
@yarosroman Куратор тега C#
C# the best
От анонимного метода или лямбды нельзя отписаться!!!!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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