C#删除事件处理程序

时间:2009-09-28 09:48:02

标签: c# events delegates

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

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

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

  3. 修改 好的,这是重复的。对于那个很抱歉。 答案已发布here

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

2 个答案:

答案 0 :(得分:29)

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

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

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

答案 1 :(得分:13)

第二个版本相当于第一个版本;它只是使用较短的语法。这是在C#2.0中实现的