【问题标题】:Reflection performance and interface反射性能和界面
【发布时间】:2014-02-21 14:59:52
【问题描述】:

我在 Jeremy Clark 的关于反射的复数会议上听说,可以通过对接口进行编程来提高反射的性能。

该视频没有解释为什么以及如何 - 有人可以向我提供有关接口为什么以及如何提高反射性能的指针

【问题讨论】:

  • 您至少应该编辑您的帖子以包含指向会议视频的链接。如果这是不可能的(或者如果你愿意的话),引用会更好。
  • 也许在 Jeremy 在会话反射中所做的特定情况下,可以用对接口的编程代替,但 AFAIK 并非一般情况。 IE。你不能总是用对接口的编程来代替反射。
  • 顺便说一句,反射在 .NET 中占有一席之地,但我看到了很多它被滥用的例子。记住反射非常强大,你几乎可以做任何你想做的事情,因此可能会被滥用。使用反射调用方法也比直接调用方法慢几个数量级。

标签: .net reflection interface


【解决方案1】:

在 Jeremy 的“Practical Reflection in .NET”讲座的Slide 23 上(2014 年 1 月发表),呈现以下内容:

  • 将类型转换为已知接口
    所有方法调用都经过接口
    没有动态方法调用——没有 MethodInfo.Invoke
    避免与私人成员互动

基本思想是最好使用反射来查找实现已知接口的类,然后是查找并直接使用单个方法和属性。原因?

  1. 您必须进行的反射调用越少越好。每次调用 Reflection 都会花费大量时间(相对而言)。对 Reflection 进行一次调用以获取一个实现已知接口的类(从这一点您可以通过接口访问成员)比通过反射访问每个成员更有效。

    李>
  2. 您可以有理由相信与已知接口关联的类成员将以特定方式运行并且不会导致危险的副作用。在处理第三方程序集时,仅根据名称从类中任意获取方法和属性是极其危险的——您无法合理地确定该方法是否是为了您的目的而使用的。

【讨论】:

  • 这基本上是使用反射进行发现。但是你不能总是使用这种方法。有时,一个类没有实现为您提供所需的接口。但如果可能的话,这是一个很好的建议。
  • @PetarRepac - 我只是想解释一下 Jeremy Clark 的意思。当然,一种方法永远不会适用于所有场景。
  • @JDB -- 感谢您的回复,它解释了接口编程如何降低反射成本(在性能方面)。
  • @JDB - 我明白这一点。只是想明确一点,这可以在某些情况下完成。顺便说一句,似乎同样的方法也应该适用于基类,而不仅仅是接口。有时,即使我没有通用接口可以使用,我也可以转换为通用基类。
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2011-04-30
  • 2011-07-13
  • 2012-09-17
  • 2022-11-11
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多