以下通过闭包将自己从事件中取消订阅的模式会导致任何问题吗?

本文关键字:模式 问题 任何 取消 闭包 自己 事件 | 更新日期: 2023-09-27 18:13:31

考虑这样一种情况:您希望为一个且仅一个通知订阅一个事件。一旦收到第一个通知,您就可以取消订阅未来的所有事件。下面的模式会出现内存问题吗?它可以工作,但我不确定自引用闭包是否可以在内存中保留比期望的更长时间的东西。

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"

以下通过闭包将自己从事件中取消订阅的模式会导致任何问题吗?

这个模式没有任何问题。这与我和其他许多人用于向事件处理程序分配和删除lambda表达式的模式完全相同。

虽然我认为一般模式是好的,但我不会通过Action<object, EventArgs>。我使用:

EventHandler listener = null;
listener = (sender, args) =>
{
    // do something interesting
    // unsubscribe, so we only get 1 event notification
    entity.NotifyEvent -= listener;
};
entity.NotifyEvent += listener;