繁体   English   中英

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

[英]Would the following pattern of unsubscribing your self from an event via closure cause any problems?

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM