定制钩子:虚拟功能或事件?

时间:2009-03-08 16:34:13

标签: c# performance

性能和设计明智的优点和缺点

使用密封的类和事件,或者使用带有虚函数的抽象类?

事件只会有一个听众...

2 个答案:

答案 0 :(得分:5)

您不应过分关注抽象类,继承和事件订阅方面的性能。这些是用于开发和开发的语言结构。维护更简单。它们的设计并非完全考虑到性能。

在性能方面,有更好的事情需要担心。我想到了一些事情:

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

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

通常,代码结构更值得担心。想一想你是如何处理数据的,以及你使用哪种模式可能会很重要。

答案 1 :(得分:1)

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