Рассмотрим ситуацию, в которой вы хотите подписаться на событие для одного и только одного уведомления. Как только появится первое уведомление, вы отмените подписку на все будущие события. Будет ли следующий шаблон представлять проблемы с памятью? Это работает, но я не был уверен, что закрывающая ссылка может хранить вещи в памяти дольше, чем хотелось бы.
public class Entity
{
public event EventHandler NotifyEvent;
}
// And then, elsewhere, for a listen-once handler, we might do this:
Entity entity = new Entity();
Action<object, EventArgs> listener = null;
listener = (sender, args) =>
{
// do something interesting
// unsubscribe, so we only get 1 event notification
entity.NotifyEvent -= new EventHandler(listener);
};
entity.NotifyEvent += new EventHandler(listener);
Обратите внимание, что вы должны объявить 'listener' и присвоить значение (null). В противном случае компилятор жалуется на «Использование неназначенной локальной переменной listener
»