C#中的运行时类型和编译时类型有什么区别?虚拟方法调用有什么含义?
答案 0 :(得分:9)
假设我们有两个类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()
的方法。被调用的方法由运行时确定,而不是由编译器“硬编码”。