P.K*_*P.K 37 .net c# events delegates anonymous-methods
说如果我听一个事件:
Subject.NewEvent += delegate(object sender, NewEventArgs e)
{
//some code
});
Run Code Online (Sandbox Code Playgroud)
现在我如何取消注册此活动?或者只是让内存泄漏?
dtb*_*dtb 42
为匿名委托的实例命名:
EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
//some code
};
Subject.NewEvent += handler;
Subject.NewEvent -= handler;
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 24
如果您需要取消注册事件,我建议您避免使用事件处理程序的匿名委托.
这是一种情况,将此分配给本地方法更好 - 您可以干净地取消订阅事件.
Ian*_*Ian 21
要在第一次调用时删除处理程序:
//SubjectType Subject = ..... already defined if using (2)
EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
// (1)
(sender as SubjectType).NewEvent -= handler;
// or
// (2) Subject.NewEvent -= handler;
// do stuff here
};
Subject.NewEvent += handler;
Run Code Online (Sandbox Code Playgroud)
您可以创建从所有事件侦听器取消注册的方法.这不完全是你想要的,但有时它可能是有帮助的.例如(这确实有效=)):
class Program {
static void Main(string[] args) {
A someClass = new A();
someClass.SomeEvent += delegate(object sender, EventArgs e) {
throw new NotImplementedException();
};
someClass.ClearEventHandlers();
someClass.FireEvent();
Console.WriteLine("No error.");
}
public class A {
public event EventHandler SomeEvent;
public void ClearEventHandlers() {
Delegate[] delegates = SomeEvent.GetInvocationList();
foreach (Delegate delegate in delegates) {
SomeEvent -= (EventHandler) delegate;
}
}
public void FireEvent() {
if (SomeEvent != null) {
SomeEvent(null, null);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20343 次 |
| 最近记录: |