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表达式指定给隐式类型的局部变量