【发布时间】:2016-10-04 12:00:21
【问题描述】:
C# 中的运行时类型和编译时类型之间有什么区别以及关于虚拟方法调用存在哪些含义?
【问题讨论】:
标签: c#
C# 中的运行时类型和编译时类型之间有什么区别以及关于虚拟方法调用存在哪些含义?
【问题讨论】:
标签: c#
假设我们有两个类A 和B,声明如下:
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() 中的哪个方法。被调用的方法由运行时决定,而不是由编译器“硬编码”。
【讨论】: