我计划在我的新项目中使用动态关键字。但在介入之前,我想了解使用动态关键字而不是反射的优点和缺点。
在专业人士的帮助下,我可以找到关于动态关键字的信息:
虽然与使用动态关键字相关的负面影响,我听到的是:
- 影响应用程序性能。
- Dynamic 关键字在内部是 Reflection 的包装。
- 动态类型可能会成为难以发现的错误的滋生地。
- 影响与以前的 .NET 版本的互操作性。
请帮我看看我遇到的利弊是否合理?
请帮我看看我遇到的利弊是否合理?
我对你的优点和缺点的担忧是,其中一些没有解决使用反射和使用动态之间的差异。动态类型导致的错误只有在任何动态类型系统的运行时都正确时才被发现。反射代码与使用动态类型的代码一样可能存在错误。
不要从优点和缺点的角度来思考它,而是以更中立的角度来思考它。我要问的问题是“什么是差异在使用反射和使用动态类型之间?”
第一:通过反射你得到exactly你要求什么。通过动态,您可以得到如果在编译时给出类型信息,C# 编译器会做什么。这些可能是两个完全地不同的东西。如果您有特定方法的 MethodInfo,并且使用特定参数调用该方法,则这就是被调用的方法, 时期。如果您使用“动态”,那么您将要求 DLR 在运行时确定 C# 编译器的意见,即哪个方法是正确的调用方法。 C# 编译器可能会选择一种与您实际想要的方法不同的方法。
第二:通过反射,您可以(如果您的代码被授予适当高水平的信任)进行私有反射。您可以调用私有方法、读取私有字段等等。我不知道这样做是否是一个好主意。对我来说这确实是危险和愚蠢的,但我不知道你的应用程序是什么。通过动态,您可以获得从 C# 编译器获得的行为;私有方法和字段不可见。
第三:使用反射,你编写的代码看起来就像机制。看起来您正在加载元数据源,提取一些类型,提取一些方法信息,并通过方法信息调用接收器对象上的方法。每一步都像是一个操作机制。有了动态,每一步看起来都像商业逻辑。在接收器上调用方法的方式与在任何其他代码中调用方法的方式相同。什么是重要的?在有些代码中,机制其实是最重要的。在某些代码中,该机制实现的业务逻辑是最重要的。选择强调正确抽象级别的技术。
第四:性能成本不同。使用反射,您不会获得任何缓存行为,这意味着操作通常会更慢,但维护缓存没有内存成本,并且每个操作的成本大致相同。使用 DLR,第一个操作确实非常慢,因为它执行大量分析,但分析会被缓存并重用。这会消耗内存,以换取某些情况下后续调用速度的提高。我不知道您的应用程序的速度和内存使用的正确平衡是什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)