【问题标题】:Does dynamic typing imply dynamic(late binding)?动态类型是否意味着动态(后期绑定)?
【发布时间】:2017-09-30 14:54:09
【问题描述】:

AFAIK,所有动态类型语言都使用后期绑定,即方法的名称在编译时未绑定到类型。相反,方法的名称用于在运行时查找它。是否可以使用动态类型并仍然使用早期绑定?

【问题讨论】:

  • c# 和 Java 与此有何关系?它们是静态类型的。
  • 它们是相关的,因为它们使用早期绑定。
  • 你可以用每种静态类型的语言来标记它。
  • 我认为情况并非如此,因为我不知道是否每种静态类型语言都使用早期绑定。例如,可以使用带有反射接口的 C# 后期绑定。
  • 我很确定你不能。并且绝对没有理由对静态类型的方法使用后期绑定,因为它只是为了它而牺牲了性能。

标签: javascript java c#


【解决方案1】:

基本上,是的,动态类型意味着绑定将在运行时“稍后”发生,但反之则不然。您可以使用强类型语言中的反射来实现late binding,而无需任何动态类型。 或者更简单,后期绑定也会在运行时解析虚拟方法调用时发生。 UPD:这实际上是Dynamic dispatch 的示例,而不是@LearningMath 正确指出的Late Binding

是否可以在使用动态类型的同时仍然使用早期绑定?

没有。这将与“动态类型”的定义/含义相矛盾。

【讨论】:

  • 使用关键字dynamic是后期绑定还是动态类型?我似乎不明白这两者之间的区别。你能详细说明一下吗?
  • @LearningMath 我认为两者兼而有之。您可以将它与动态对象一起使用(这是一种放松 C# 类型系统并为其带来一些动态类型元素的方式)。在 .NET 中,这些是从 DynamicObject 继承的对象,并且能够在运行时自己进行动态绑定。另一方面,您可以将dynamic 关键字与任何强类型CLR 对象一起使用,它只会推迟绑定到运行时。您可以在此处查看有关 DLR 的一些基本信息:docs.microsoft.com/en-us/dotnet/framework/…
  • 那么,前者是动态类型的使用,而后者只是动态绑定吧?
  • 虚拟调用解析不是和后期绑定不完全一样的动态调度吗?编译器实际上有一些关于编译时情况的信息。
猜你喜欢
  • 2018-03-12
  • 2010-12-10
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多