C#删除事件处理程序

Sha*_*run 26 c# events delegates

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

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

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

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

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

Chr*_*ter 29

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

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

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

  • @Christian:不,它没有实习 - 它只是使用Delegate.Equals,它比较了方法和目标. (3认同)
  • 实习是指在创建新实例之前检查是否已存在具有相同值的现有实例.如果存在这样的实例,则返回该实例.这可以保证内存中只存在该类型的唯一实例.例如,除非您手动调用`String.Intern`,否则字符串总是在编译时实现,但不能在运行时实现. (2认同)

Ada*_*ras 13

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