C#

时间:2016-06-04 13:47:39

标签: c#

C#中的运行时类型和编译时类型有什么区别?虚拟方法调用有什么含义?

1 个答案:

答案 0 :(得分:9)

假设我们有两个类AB声明如下:

internal class A
{
    internal virtual void Test() => Console.WriteLine("A.Test()");
}

internal class B : A
{
    internal override void Test() => Console.WriteLine("B.Test()");
}

B继承自A并覆盖方法Test,该方法将消息输出到控制台。

  

C#

中的运行时类型和编译时类型有什么区别

现在让我们考虑以下声明:

A test = new B();

  • 在编译时:编译器只知道变量test属于A类型。他不知道我们实际上是在给他一个B的实例。因此,test的编译类型为A

  • 运行时
  • test的类型已知为B,因此其运行时类型为B

  

以及虚拟方法调用存在哪些含义

考虑以下代码声明:

((A)new B()).Test();

我们正在创建一个B实例,将其转换为类型A并在该对象上调用Test()方法。编译器类型为A,运行时类型为B

当编译器想要解决.Test()调用时,他遇到了问题。由于A.Test()virtual,编译器无法简单地调用A.Test,因为存储的实例可能已覆盖该方法。

编译本身无法确定调用A.Test()B.Test()的方法。被调用的方法由运行时确定,而不是由编译器“硬编码”。