在.NET中使用反射会对性能产生相当不利的影响吗?

6

可能重复:
反射有多么昂贵?

出于使我的代码通用的目的,我开始使用反射 - 获取DTO对象中的一些属性并对其进行设置 -

与硬编码的setter相比,使用反射获取属性并对其进行设置会对性能产生如此严重的影响吗?

3个回答

6
是的,使用反射确实会产生成本。
然而,它对整个应用程序性能的实际影响因情况而异。一个经验法则是不要在执行多次的代码中使用反射,比如循环。这通常会导致算法指数级地变慢(O(cn))。
在许多情况下,您可以使用委托编写通用代码,而不是使用反射,如此博客文章所述。

你可以在反射中使用委托。 - leppie

2

是的,反射确实很慢。你可以试着通过将通过反射检索得到的 xxxInfo(例如 MethodInfo、PropertyInfo 等)对象缓存到每个反射类型中,并将它们保存在一个字典中来减少其影响。字典中的后续查找比每次检索信息要快。

你也可以在这里搜索一些关于反射性能的问题。对于某些边缘情况,有一些相当有效的解决方法,如使用CreateDelegate调用方法而不是使用MethodInfo.Invoke()


0

除了速度较慢之外,通过反射设置属性是一个设计问题,因为您显然已经通过面向对象设计分离了关注点或封装了属性,这现在阻止您直接设置它们。我建议您查看设计(虽然可能存在边缘情况),而不是考虑反射。

除了性能影响之外,其中一个缺点是您正在使用静态类型语言,因此编译器检查您的代码并将其编译。通常,在编译时,您可以确定您使用的所有属性都存在且拼写正确。当您开始使用反射时,您将此检查推迟到运行时,这真是太糟糕了,因为您(在我看来)错过了使用静态类型语言的最大好处之一。这也会限制您在(近)未来进行重构的机会,因为您不再确定在重命名属性时是否替换了所有赋值的出现次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接