C# 早期和晚期绑定概念

本文关键字:绑定 | 更新日期: 2023-09-27 18:36:37

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

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

我的问题是,编译器什么时候可以识别对象的函数调用,无论是在编译时还是运行时?如果我不清楚,我很抱歉。 但我的意思是问,虚拟覆盖和虚拟方法的概念是否涉及后期绑定?如果不是,那怎么可能。

C# 早期和晚期绑定概念

运行时。

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

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

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

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