c# - 动态朗。运行时与反射

标签 c# dynamic reflection dynamic-language-runtime

我打算为我的新项目使用动态关键字。但在介入之前,我想了解使用动态关键字而不是反射的优缺点。

在专业人士之后,我可以找到关于动态关键字的信息:

  • 可读\可维护的代码。
  • 更少的代码行。

虽然与使用动态关键字相关的负面影响,我听说是这样的:

  • 影响应用程序性能。
  • 动态关键字在内部是反射的包装器。
  • 动态类型可能会成为难以发现错误的滋生地。
  • 影响与以前 .NET 版本的互操作性。

请帮我看看我遇到的利弊是否合理?

最佳答案

Please help me on whether the pros and cons I came across are sensible or not?

我对您的优点和缺点的担忧是,其中一些优点和缺点没有解决使用反射和使用动态之间的差异。动态类型导致的错误在任何动态类型系统的运行时都是真实的之前不会被捕获。反射代码与使用动态类型的代码一样有可能出现错误。

与其从利弊的角度考虑,不如从更中性的角度考虑。我要问的问题是“使用反射和使用动态类型之间的区别是什么?”

首先:通过反射,您完全得到您所要求的。使用动态,您可以如果在编译时获得类型信息,C# 编译器会做什么。这些可能是两个完全不同的东西。如果您有特定方法的 MethodInfo,并且您使用特定参数调用该方法,那么这就是被调用的方法,句号。如果您使用“动态”,那么您是在要求 DLR 在运行时计算出 C# 编译器的意见是关于哪个是正确的调用方法。 C# 编译器可能会选择一种与您实际需要的方法不同的方法。

第二:通过反射,您可以(如果您的代码被授予适当的高级别信任)进行私有(private)反射。您可以调用私有(private)方法、读取私有(private)字段等。这样做是否是个好主意,我不知道。这对我来说当然是危险和愚蠢的,但我不知道你的应用程序是什么。使用动态,您可以获得从 C# 编译器获得的行为;私有(private)方法和字段不可见。

第三:通过反射,您编写的代码看起来像一个机制。看起来您正在加载元数据源,提取一些类型,提取一些方法信息,并通过方法信息在接收者对象上调用方法。每一步看起来都像是一个机制的运作。有了动态,每一步看起来都像业务逻辑。您在接收器上调用方法的方式与在任何其他代码中调用的方式相同。什么是重要的?在一些代码中,机制实际上是最重要的。在一些代码中,机制实现的业务逻辑是最重要的。选择强调正确抽象级别的技术。

第四:性能成本不同。使用反射,您不会获得任何缓存行为,这意味着操作通常较慢,但维护缓存没有内存成本,并且每个操作的成本大致相同。使用 DLR,第一个操作确实非常慢,因为它要进行大量分析,但分析会被缓存和重用。这会消耗内存,以换取某些场景下后续调用的速度提高。我不知道您的应用程序的速度和内存使用的正确平衡是什么。

关于c# - 动态朗。运行时与反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646786/

相关文章:

c# - WebSocket4Net - 在 websocket 上收到 'return' 消息

c# - 有一组任务,一次只运行 X

javascript - 动态按钮 ID - Javascript

c++ - 使用cpp中的参数动态调用外部dll

java - 如何让 Android 按钮阵列的 onClickListener 正常工作

reflection - 按名称调用其他包中的方法?

c# - 从 C# 中检索程序集的 MVID?

c# - new DateTime() 和 DateTime.Parse 的不同结果

c# - 使用 LINQ 聚合对象

java - 指定接口(interface)的反射图