【问题标题】:How does CLR resolve method involving a dynamic type?CLR 如何解析涉及动态类型的方法?
【发布时间】:2012-01-16 04:04:16
【问题描述】:

给定,

方法重载 = 编译时间解析。

方法覆盖 = 运行时分辨率。

CLR如何解析下面的方法调用(涉及动态类型)?

    dynamic intValue = -10;
    var result = Math.Abs(intValue);

感谢您的关注。

【问题讨论】:

  • 你见过this吗?
  • 你测试过输出是什么吗? Console.WriteLine(result.GetType()); 应该这样做...
  • 注意:可能无法解决。使用动态可能会导致运行时错误。

标签: c# c#-4.0 dynamic


【解决方案1】:

将名称与名称联系起来的过程称为绑定。正常的重载决策是“早期”绑定,因为方法名称的确切含义是在编译时很早就确定的。

当编译器在重载解析期间遇到虚拟方法时,它会发出一个虚拟调用。在运行时,这会被路由到正确的方法,可能会被覆盖。

当编译器遇到动态对象时,它会发出代码来执行“后期”绑定,即在运行时。后期绑定就像运行时的​​重载决议。代码查看参数,找出它的整数,查找要调用的正确重载,然后调用它。

嗯,实际上它的作用远不止这些。它缓存查找结果并进行测试,以便下次运行代码时,如果参数类型为int,它可以直接调用正确的方法。

这仍然是一个简化。实际上,可以进行更多优化以获得最佳性能。

请参阅this blog post,以更全面地了解您的示例究竟会发生什么。

【讨论】:

    【解决方案2】:

    涉及动态类型参数的方法绑定在 C# 中有点棘手。编译器使用的第一条也是基本规则是:类型优先于动态。例如:

    void 方法(动态 x,字符串 y) { //做一点事 }
    无效方法(int x,字符串 y) { // 做一点事 } 对带有参数 int 和字符串 method(5,"some string) 的方法的调用将被解析为第二个函数。但是,如果任何一个方法的参数都是动态的,编译器就会抱怨方法调用不明确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2011-03-23
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多