如何删除该事件?

时间:2011-07-08 13:17:23

标签: c# events

样品......

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 -= () => {  }; 

但是我认为当事件中有太多来源时,这非常难看...... 有人可以告诉我删除活动的最佳方法吗?

3 个答案:

答案 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#编程指南)。