【问题标题】:Customization hooks: virtual functions or events?自定义钩子:虚函数还是事件?
【发布时间】:2009-03-08 16:34:13
【问题描述】:

性能和设计方面的优缺点

使用密封类和事件还是使用带有虚函数的抽象类?

事件只有一个监听器...

【问题讨论】:

  • 您需要更具体地了解您正在比较的备选方案。

标签: c# performance


【解决方案1】:

您不必太担心抽象类、继承和事件订阅方面的性能。这些是旨在简化开发和维护的语言结构。它们的设计并没有完全考虑到性能。

在性能方面有更好的事情需要担心。想到了几件事:

  • Boxing & unboxing - 如果您正在执行大量重复或迭代的任务,请尽量避免对对象进行过多的装箱和拆箱。
  • Reference Types vs. Value Types - 创建为“结构”的对象按值存储。这意味着对象的整个值在内存中发送时都会被传递。这可能会更昂贵,但它的生命周期更具确定性,因此它具有通常仅存在于特定范围内的优势。创建为“类”的对象通过引用存储。当通过代码发送引用对象时,您只发送 reference 到对象,这意味着更少的内存可以移动。缺点是因为它是分配给堆的,所以它在内存中的寿命不太确定。
  • Subscribing/unsubscribing to events - 这与其说是性能问题,不如说是一般的开发错误。除非取消订阅所有事件,否则不会对对象进行 GC。如果您保持订阅打开,您的对象可能会永远保留在内存中,从而导致内存泄漏。 Microsoft 在WeakEvent pattern 上有很好的文档来帮助解决这个问题。

您还应该阅读Microsoft's MSDN documentation on Performance。这是了解 .NET 中真正的性能杀手的一个很好的参考。密封和抽象类以及事件处理程序通常不是性能问题。

一般来说,代码结构更值得担心。想想您是如何处理数据的,以及您使用的哪些模式执行起来可能很繁重。

【讨论】:

    【解决方案2】:

    它们看起来并不完全像类似的替代方案......如果问题是虚拟方法是否比调用事件更快,那么答案是肯定的,但只是略微。

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2019-07-28
      • 2020-12-30
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2020-12-25
      相关资源
      最近更新 更多