【问题标题】:Ramifications of Virtual Methods/Properties虚拟方法/属性的后果
【发布时间】:2009-11-21 07:40:20
【问题描述】:

我最近在开发过程中一直在使用 Moq,我喜欢我能够实现的目标。

但是,我发现自己将我的方法(以及大部分属性)虚拟化,以便我可以在测试中用模拟替换它们。

除了“你让你的所有方法和属性都可以覆盖”之外,这个行动过程还有哪些现实世界的影响?

【问题讨论】:

  • 您是否考虑过让您的类实现一个定义所有这些方法的接口?这样你的 Mock 是基于接口的,你不必用 virtual 关键字显式标记你的所有方法......
  • 这也会带来虚拟化的大部分缺点。但是,它确实让事情变得更加灵活,所以归根结底,它可能是更好的选择。

标签: c# moq virtual-functions


【解决方案1】:

好吧,您会阻止大多数类型的优化。 首先,JITter 可能不知道要调用哪个实现,(而且他不知道,因为您可能正在使用 Mock,对吗?) 因此,所有这些本来会被内联的属性访问器现在将是真正的调用。感谢内联,简单的属性不会在运行时增加真正的开销。虚拟属性不会被内联,所以它们会。

这是事物的性能方面,另一个问题是,您不能相信属性会按照您认为的那样工作。 每个属性都可以被覆盖。即使是你自己,因为“这一次真的很有意义,对吧?”。因此,您会发现自己比平时更频繁地检查调用树,以检查哪些实现适用于您正在处理的代码。

【讨论】:

  • 感谢您的回复,罗伯特! +1
【解决方案2】:

我不认为有任何严重的后果。意外覆盖您不打算覆盖的方法/属性的可能性非常小。

我认为将一类对象替换为另一类对象(例如模拟对象)的能力是一件好事,要做到这一点,您需要一个具有虚拟方法/属性的基类。它让我想起了使用抽象基类来遵守Open Closed Principle。

【讨论】:

  • 它肯定有助于 OCP 的开放部分; +1 感谢您的回复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多