C# 删除事件处理程序

标签 c# events delegates

我已经这样做了一段时间,但我没有注意到每次删除事件处理程序时我都在使用 new。我应该创建一个新对象吗?

基本上 1 和 2 之间有区别吗?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

编辑: 好的,这是重复的。对于那个很抱歉。 答案已发布here .

具有相同目标、方法和调用列表的相同类型的两个委托(delegate)被认为是相等的。

最佳答案

1 和 2 之间没有区别,因为 2 是 1 的语法糖。只有当 2 引用类级委托(delegate)实例字段而不是实际方法名称时,编译的 IL 才会有区别。

就运行时发生的事情而言,事件 Remove 方法似乎并不关心传递给它的委托(delegate)实例是否与传递给 Add 的委托(delegate)实例相同 方法。我不记得为什么会这样,但我猜委托(delegate)实例总是被保留的。

编辑:Jon Skeet 说事件Remove 方法使用值相等(Delegate.Equals)来确定要从列表,而不是实习+引用平等。相同的结果,不同的方法。 :-)

关于C# 删除事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1486214/

相关文章:

c# - 从配置文件中读取属性参数值

javascript - 停止 OpenLayers 2 中的事件?

javascript - JQuery ui Slider 中未触发事件

c# - 无法将方法组 '' 转换为非委托(delegate)类型 'System.Delegate'。您是否打算调用该方法?

C# 将 block 与引用 IDisposable 对象的匿名方法一起使用

c# - 如何将虚拟目录配置为 IIS 中的应用程序

c# - 如何将自定义动画添加到 ContextMenuStrip?

java - 将凭据从 dotNet 客户端传递到 Java Web 服务

javascript - 委托(delegate)事件触发,即使它不应该触发

c# - 向现有函数添加功能(C#、C++)