C# 如何删除该事件?
关于样品 样本类别:C# 如何删除该事件?,c#,events,C#,Events,关于样品 样本类别: public class SampleClass { public delegate void BeforeEditorHandle(); public event BeforeEditorHandle OnBeforeEditor; } 主要方法 static void Main(string[] args) { SampleClass sc = new SampleClass(); // Add Even
public class SampleClass
{
public delegate void BeforeEditorHandle();
public event BeforeEditorHandle OnBeforeEditor;
}
主要方法
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 += () => { };
我应该像这样删除事件吗↓
sc.OnBeforeEditor -= () => { };
sc.OnBeforeEditor -= () => { };
但我认为这是非常丑陋的,当我在事件中有太多的来源。。。。
有谁能告诉我删除事件的最佳方法吗?您可以将事件处理程序/lambda分配给一个变量,然后您可以订阅和取消订阅该变量:
var myHandler = () => { };
sc.OnBeforeEditor += myHandler;
sc.OnBeforeEditor -= myHandler;
BeforeEditorHandle myHandler=() => { }
sc.OnBeforeEditor += myHandler;
...
sc.OnBeforeEditor -= myHandler;
我很确定您的代码在这里不起作用: 如果我像这样通过动态方式添加事件。。。↓
sc.OnBeforeEditor += () => { };
sc.OnBeforeEditor += () => { };
我应该像这样删除事件吗↓
sc.OnBeforeEditor -= () => { };
sc.OnBeforeEditor -= () => { };
这是因为重新启动lambda会创建一个新的不同lambda
您需要存储旧引用并使用它取消订阅:
var myHandler = () => { };
sc.OnBeforeEditor += myHandler;
sc.OnBeforeEditor -= myHandler;
BeforeEditorHandle myHandler=() => { }
sc.OnBeforeEditor += myHandler;
...
sc.OnBeforeEditor -= myHandler;
为了更方便地取消订阅,您可以在集合中收集事件处理程序(例如List
)。来自:
重要的是要注意你
无法轻松取消订阅
事件,如果您使用匿名
函数来订阅它。到
取消订阅在这种情况下,它是
需要返回到代码所在的位置
您订阅了活动,存储了
委托中的匿名方法
变量,然后将委托添加到
这件事。一般来说,我们建议
不要使用匿名
在以下情况下订阅事件的函数:
您将不得不取消订阅
事件发生在您的
代码。有关
匿名函数,请参见匿名
函数(C#编程指南)
@奥德,你换了什么?我想我们有编辑冲突。只在
前面添加了4个空格…
:)您需要显式键入myHandler
。(无法将lambda表达式指定给隐式类型的局部变量
)