【问题标题】:Attaching Eventhandler with New Handler vs Directly assigning it使用新处理程序附加事件处理程序与直接分配它
【发布时间】:2011-09-21 11:42:18
【问题描述】:

创建新的事件处理程序与将其直接分配给事件的实际区别、优点和缺点是什么?

_gMonitor.CollectionChanged += new NotifyCollectionChangedEventHandler(OnCollectionChanged);

对比

_gMonitor.CollectionChanged += OnCollectionChanged;

【问题讨论】:

标签: c# events syntax


【解决方案1】:

在 C# 2.0 及更高版本中,它们是相同的。在 C# 1.2(.NET 1.1 附带的那个)中,只有第一个语法(带有new)编译;-p

第二种语法可以节省按键,但 VS intellisense 通常会建议第一种。最终,它几乎没有什么区别。我通常在在线代码示例中使用第二种语法,仅仅是因为它避免了超过(窄)列宽!

【讨论】:

  • 我认为第一个会造成内存泄漏问题,但我找不到任何证据来证明这一点。但是我过去遇到过这样的问题,Windows 服务没有关闭只是因为 timer.Tick += new Handler_Tick(timer_TickMethod); 不是 timer.Tick += timer_TickMethod; 并且取消订阅对 timer.Tick += new Handler_Tick(timer_TickMethod); 没有帮助。
  • @HarshBaid 你不正确;它们编译成完全相同的东西。对于信息,委托取消订阅基于 MethodInfo 和 instance 上的匹配;它不需要是相同的实际委托实例才能正确取消订阅
  • _gMonitor.CollectionChanged -= OnCollectionChanged_gMonitor.CollectionChanged += new NotifyCollectionChangedEventHandler(OnCollectionChanged) 怎么样,第一个选项可以吗?
  • @mark hm 我认为您是对的,我会将它与取消订阅事件处理程序混合使用。 :P
  • @LouisRhys,除了“一个是订阅,一个是取消订阅”之外,它们是相同的
【解决方案2】:

编译器有足够的可用信息使new EventHandler 有效地syntactic sugar

它知道您将事件处理程序附加到事件,因为此时只有+=-= 有效,因此您无需告诉它要做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2018-01-25
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多