C#删除的事件处理程序(C# removing an event handler)

2019-07-19 20:51发布

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

基本上是有1和2之间的差?

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

编辑:好吧,这是重复的。 对于那个很抱歉。 答案贴在这里 。

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

Answer 1:

有1和2之间没有差别,因为2是语法糖1.只有2称为一个类级委托实例字段而不是实际的方法名称会有在已编译的IL的差。

在运行时会发生什么情况来看,该事件Remove方法似乎并不关心传递给它的委托实例是否是同一个作为一个传递给Add方法。 我不记得了手这是为什么,但我猜想,委托实例总是被拘留。

编辑:乔恩斯基特说,事件Remove方法使用的值相等( Delegate.Equals ),以确定到从列表中删除,其代表,而不是实习+参考平等。 相同的最终结果,不同的方法。 :-)



Answer 2:

第二版本是等同于第一; 它只是使用更短的语法。 这是实现在C#2.0



文章来源: C# removing an event handler