2009-09-28 329 views
26

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

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

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

编辑: 好吧,这是一个重复。对于那个很抱歉。 答复已发过标签here

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

回答

29

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

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

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

+0

由于委托只是对方法和(可选)实例的引用,所以比较这两个方法应该足以确定相等性。 – Botz3000 2009-09-28 09:55:38

+0

是的,但一般来说,如果您在任意引用类型上调用'new T()'两次,您会得到两个不同的实例。由于这对于委托人来说似乎不是这样,我推断委托构造函数会像'Type'类一样自动实例化实例。 – 2009-09-28 10:00:23

+0

实习 - 这是什么意思?感谢你的回答。这种解决我的疑问。当我添加处理程序并在删除处理程序时创建一个新处理程序时,我对这个新程序感到疑惑,因为我正在创建一个新的程序。很奇怪。 – Sharun 2009-09-28 10:10:31

13

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