C#早期和晚期绑定概念

时间:2012-06-08 08:00:32

标签: c# binding

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

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); 
   } 
} 

我的问题是编译器何时会识别对象的函数调用,它是在编译时还是在运行时? 如果我不清楚,我很抱歉。      但我的意思是问虚拟骑乘和虚拟方法的概念是否涉及后期绑定? ..如果没有那么这怎么可能。

2 个答案:

答案 0 :(得分:5)

运行系统。

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

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

答案 1 :(得分:0)

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

要了解有关绑定的更多信息以及延迟使用的内容,请阅读以下文章:http://blogs.msdn.com/b/ericlippert/archive/2012/02/06/what-is-quot-binding-quot-and-what-makes-it-late.aspx