【问题标题】:C# Early and Late Binding conceptC# 早期和晚期绑定概念
【发布时间】:2012-06-12 06:59:47
【问题描述】:

众所周知,早期绑定是声明特定数据类型的对象的概念,它不能容纳任何其他类型的对象。虽然后期绑定是声明泛型对象的概念,并且可以保存任何其他类型的实例。 考虑这个例子:

public abstract class Animal  
{ 
 public virtual string Name { get { return "Animal"; } } 
} 

public class Dog : Animal 
{ 
  public override string Name { get { return "Dog"; } } 
} 

public class Cat : Animal 
{ 
  public override string Name { get { return "Cat"; } } 
} 

public class Test  
{ 
  static void Main() 
  {
      Animal animal = new Dog(); 
      Animal animalTwo = new Cat(); 

      Console.WriteLine(animal.Name); 
      Console.WriteLine(animalTwo.Name); 
   } 
} 

我的问题是编译器何时会识别对象的函数调用,无论是在编译时还是运行时? 如果我不清楚,我很抱歉。 但我的意思是要问 Virtual override 和 virtual 方法的概念是否涉及后期绑定? ..如果不是那怎么可能。

【问题讨论】:

    标签: c# binding


    【解决方案1】:

    运行时。

    虚函数意味着调度在运行时被路由到活动对象引用上的函数。在 C++ 中,这是通过称为 vtable 的指针表完成的。我不确定 C# 是如何做到的,我认为它依赖于实现,但结果是一样的。

    在编译时,编译器会将函数调用绑定到基类上的函数。该基类函数是虚拟的,因此在运行时.Net 将查看实际的对象类型并查看它是否覆盖了该函数。如果确实如此,则将调用该派生类型。

    【讨论】:

    • Gaz: 如果我写 Cat c =new Cat();并将函数称为 c.Name();那么它会在编译时被识别吗??
    • 虚函数在整个层次结构中都是虚函数,因此 c.Name 仍会涉及某种查找,以防派生类型覆盖它(例如 BlackCat)。
    • 您的意思是虚拟调度是后期绑定的一种形式,即如果一个函数被定义为虚拟,那么任何对该函数的调用都会在运行时被识别???
    • 没有。后期绑定和动态调度是两个不同的东西。虚函数在编译时(早期)绑定,但在运行时分派。 C# 中的后期绑定将涉及使用反射。
    【解决方案2】:

    是的,虚方法涉及后期绑定。

    要了解有关绑定的更多信息以及导致迟到的原因,请阅读这篇文章:http://blogs.msdn.com/b/ericlippert/archive/2012/02/06/what-is-quot-binding-quot-and-what-makes-it-late.aspx

    【讨论】:

    • 在纪尧姆:c# 涉及后期绑定??我只在stackoverflow上读到除了动态和反射接口之外的所有东西都是c#中的早期绑定这里是链接:[link]stackoverflow.com/questions/484214/…
    • “虚拟分派是后期绑定的一种形式”- Eric Lippert,C# 编译器团队的主要开发人员。
    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多