以下模式通过关闭取消订阅事件会导致任何问题吗?

Mat*_*att 5 .net c# events delegates .net-4.0

考虑您希望为一个且仅一个通知订阅事件的情况.第一次通知到达后,您取消订阅所有未来事件.以下模式会出现任何内存问题吗?它可以工作,但我不确定自引用闭包是否可以使内存中的内容长于预期.

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);
Run Code Online (Sandbox Code Playgroud)

请注意,您必须声明'listener'并指定一个值(null).否则编译器会抱怨"使用未分配的局部变量listener"

Jar*_*Par 6

这种模式没有错.这是我和许多其他人用于为事件处理程序分配和删除lambda表达式的模式.