Possible Duplicate:
How costly is .NET reflection?

我现在有一种编程心态,认为反射是我最好的朋友.我经常使用它来动态加载允许"松散实现"而不是严格接口的内容,以及许多自定义属性.

使用反射的"真正"成本是多少?

对于频繁反射的类型来说,缓存反射是否值得,比如我们自己的预LINQ DAL对象代码对所有属性到表定义进行缓存反射?

缓存内存占用是否会超过反射CPU使用率?

推荐答案

反射需要加载并处理大量类型元数据.这可能会导致更大的内存开销和更慢的执行.根据this article,属性修改大约慢2.5x-3x,方法调用慢3.5x-4x.

下面是一篇优秀的MSDN article篇文章,概述了如何加快反射速度,以及开销在哪里.如果你想了解更多,我强烈建议你阅读.

还有一个复杂的因素,反射可能会增加代码的复杂性,这使得代码更加混乱,因此难以处理.有些人,比如Scott Hanselman人,相信通过反思,你经常制造出比你解决的问题更多的问题.如果你的团队大多是初级开发人员,情况尤其如此.

如果需要很多动态行为,那么最好查看DLR(动态语言运行时).随着新变化的到来.NET 4.0您可能想看看是否可以将其中的一部分合并到您的解决方案中.VB和C增加了对动态的支持,使得使用动态代码非常优雅,创建自己的动态对象非常简单.

祝你好运

编辑:我在斯科特的网站上做了更多的搜索,在反思中找到了这podcast个.我没听过,但可能值得一段时间.

.net相关问答推荐

在接口内部声明 IEnumerable 而在具体类中声明 IList

在 WebApi 中需要 SSL?

如何将 Javascript 日期时间转换为 C# 日期时间?

如何使用 Moq 为不同的参数设置两次方法

比较 C# 中的字符串和对象

我可以从 .NET/C# 获取其他进程的命令行参数吗?

如何从 appsettings.json 中获取价值

如何等到远程 .NET 调试器附加

C# 中的 myCustomer.GetType() 和 typeof(Customer) 有什么区别?

在 .NET Core RC2 中构建 .exe 文件

双倍的? = 双倍? + 双倍?

何时使用抽象类?

文件按文件名模式存在

Linq to SQL - 返回前 n 行

.NET 进程间通信的最佳 Select 是什么?

Find() 和 First() 抛出异常,如何改为返回 null?

找不到库 hostpolicy.dll

.NET 委托类型的正确命名约定?

找不到 System.Windows.Media 命名空间?

.NET Remoting 真的被弃用了吗?