样品......
SampleClass:
public class SampleClass
{
public delegate void BeforeEditorHandle();
public event BeforeEditorHandle OnBeforeEditor;
}
MainMethod
static void Main(string[] args)
{
SampleClass sc = new SampleClass();
// Add Event
sc.OnBeforeEditor +=new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);
// Remove Event
sc.OnBeforeEditor -= new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor);
}
而且,如果我像这样动态添加事件......↓
sc.OnBeforeEditor += () => { };
我应该删除像↓
这样的事件sc.OnBeforeEditor -= () => { };
但是我认为当事件中有太多来源时,这非常难看...... 有人可以告诉我删除活动的最佳方法吗?
答案 0 :(得分:8)
您可以将事件处理程序/ lambda分配给您可以订阅和取消订阅的变量:
var myHandler = () => { };
sc.OnBeforeEditor += myHandler;
sc.OnBeforeEditor -= myHandler;
答案 1 :(得分:6)
我很确定你的代码不起作用:
而且,如果我像这样动态添加事件......↓
sc.OnBeforeEditor += () => { };
我应该删除像↓
这样的事件sc.OnBeforeEditor -= () => { };
这是因为重新设置lambda会创建一个新的不同lambda。
您需要存储旧引用并使用它来取消订阅:
BeforeEditorHandle myHandler=() => { }
sc.OnBeforeEditor += myHandler;
...
sc.OnBeforeEditor -= myHandler;
为了便于取消订阅,您可以在集合中收集事件处理程序(例如List<BeforeEditorHandle>
)。
答案 2 :(得分:2)
来自MSDN:
重要的是要注意到你 不能轻易取消订阅 如果您使用匿名活动 订阅它的功能。至 取消订阅在这种情况下,它是 必须回到代码所在的地方 你订阅了这个活动,存储了 委托中的匿名方法 变量,然后将委托添加到 事件。一般来说,我们建议 你不使用匿名 函数来订阅事件if 你将不得不取消订阅 在你的某个晚些时候发生的事件 码。有关的更多信息 匿名函数,请参阅匿名 功能(C#编程指南)。