我经常听说使用反射是多么糟糕。虽然我通常避免反思,也很少发现不反思就无法解决问题的情况,但我在想……

对于那些在应用程序中使用反射的人,您测量过性能影响吗?它真的那么糟糕吗?


当前回答

如果将反射用于频繁创建对象,则它会对性能产生显著影响。我开发了一个基于复合UI应用程序块的应用程序,它严重依赖反射。通过反射创建对象时,有明显的性能下降。

但是在大多数情况下,使用反射是没有问题的。如果你只需要检查一些组装,我会推荐Mono。塞西尔,非常轻,速度很快

其他回答

它是。但这取决于你要做什么。

我使用反射动态加载程序集(插件),它的性能“惩罚”不是问题,因为操作是我在应用程序启动期间所做的事情。

然而,如果你在一系列嵌套循环中反射,每个循环都有反射调用,我想说你应该重新审视你的代码:)

对于“几次”操作,反射是完全可以接受的,您不会注意到任何延迟或问题。它是一种非常强大的机制,甚至被。net使用,所以我不明白为什么你不应该尝试一下。

和所有事情一样,这都是关于评估形势。在DotNetNuke中,有一个相当核心的组件叫做FillObject,它使用反射从数据箭头填充对象。

这是一个相当常见的场景,在MSDN上有一篇文章,使用反射将业务对象绑定到ASP。NET表单控件,涵盖了性能问题。

除了性能之外,我不喜欢在这种特定情况下使用反射的一件事是,它往往会降低快速理解代码的能力,对我来说,当你考虑到与强类型数据集或类似LINQ to SQL的数据集相比,你还失去了编译时的安全性,这似乎不值得付出努力。

我想你会发现答案是,这要看情况。如果您想把它放在任务列表应用程序中,这不是什么大问题。如果你想把它放在Facebook的持久性库中,这是一件大事。

如果将反射用于频繁创建对象,则它会对性能产生显著影响。我开发了一个基于复合UI应用程序块的应用程序,它严重依赖反射。通过反射创建对象时,有明显的性能下降。

但是在大多数情况下,使用反射是没有问题的。如果你只需要检查一些组装,我会推荐Mono。塞西尔,非常轻,速度很快

在Jeff Richter的演讲The Performance of Everyday Things中,他展示了通过反射调用一个方法要比正常调用慢1000倍。

Jeff的建议:如果需要多次调用该方法,请使用一次反射来找到它,然后将其分配给委托,然后调用委托。