【问题标题】:Speeding up Reflection API with delegate in .NET/C#在 .NET/C# 中使用委托加速反射 API
【发布时间】:2011-06-21 18:52:46
【问题描述】:

这个post 有评论if you need to call the method multiple times, use reflection once to find it, then assign it to a delegate, and then call the delegate.

  • delegate 如何以及为什么工作得更快?谁能举个例子?
  • 我可以打电话给caching吗?如果是这样,除了这个带委托的缓存方法之外,还有其他方法吗?

添加

我想出了一个使用delegatehere的例子。

【问题讨论】:

    标签: c# .net reflection delegates


    【解决方案1】:

    delegate 只是一个指向函数的指针。如果您(完全)使用反射,通常会有很多与之相关的开销。通过一次找到此方法地址并将该地址分配给您的委托变量,您实际上是在缓存它。

    因此,不是“委托”类型工作得更快,只是您“计算”一次并多次“使用”它可以提高速度。

    【讨论】:

    • 委托不是指针。托管 C# 代码没有指针。它有参考。托管 C# 代码中没有变量保存内存地址(除非您故意为此做一些讨厌的工作)。
    • @Neowizard 我很欣赏这种吹毛求疵的做法,但我直言不讳。
    • @Brandon 想想 lambda () => x++;其中 x 是定义 lambda 的方法中的局部变量。如果委托只是一个指针,那么这个 lambda 存储在内存中的哪里,为什么那里有对 x 的引用?就像哈里斯所说,委托不是指针,它们是持有实例(或更准确地说是实例范围)和方法(如果必须的话,将其称为指向方法的指针)的对象。 Lambda/Delegate 的概念源自函数式编程,其中指针的概念通常甚至不存在。
    • @Neowizard 的 概念 是相同的,自从 Dennis Ritchie 通过“C”语言引入它以来一直相同。在您的示例中,“x”是针对该特定函数的局部变量,它与“拥有”函数入口点是内存中的地址没有任何关系。将该地址称为“引用”或“指针”,没关系。
    • @Brandon 就是这样,我没有给地址打电话,一开始就没有地址。说委托是指向函数的指针就像说 C# String 与 C 的 char* 没有什么不同,如果这就是你所说的,那么这不是开始这场温和辩论的正确地方。
    【解决方案2】:

    Delegate.CreateDelegate

    可能是 MSDN 上最好的文档 :)

    【讨论】:

      【解决方案3】:

      显然它会更快地工作,因为反射引起的偷听减少了。如果您遵循提示,则不会每次都进行反射,而是将引用存储在委托中,因此通过不重做反射来降低成本。所以是的,我想一旦你在委托中存储引用,它就会像缓存一样,在某种意义上你不必再次进行反射

      【讨论】:

        【解决方案4】:

        拳头,这不是缓存。您没有将方法的副本保存在“更近”的位置,您只是保留对该方法的引用。

        考虑使用反射调用方法所需采取的步骤(从程序集中访问重新定义数据,按名称查找方法/命名空间/类等等...),最后一步是获取引用(并且不要让任何人告诉您委托是指针!)到方法并调用它。 当您使用委托时,您只需要完成最后一步,就可以省去反射带来的所有麻烦。

        【讨论】:

          【解决方案5】:

          这不是很明显。您将程序集加载到您的应用程序域中;创建该类型的一个实例,然后创建一个指向该实例方法的委托...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-16
            • 2012-06-04
            相关资源
            最近更新 更多