今天在看C#参考时明白了 什么是C#的运行时类型与编译时类型,记录下来,以备查阅:
相信很多刚学C#的人都对这两个概念感到迷惑,其时并不难(以前太重于技术可用性,比如:asp.net中的DataDrid怎么用等问题,没大研究过这方面),希望能对C#初学者有所帮助。请看如下代码:
{...}
class B
{...}
class App
{
public static void Main()
{
A a = new A(); // 实例化一个A的对象a
B b = a; // 把B的对象b指向a
......
}
}
以上代码中的对象a没什么好说的,运行时与编译时类型均为A
而对象b的运行时类型为A,编译时类型为B
说说原因,因为对象a,b本身都是引用类型,在编译时对象b的类型由我们写的B b来确定,而在程序运行后发现b引用的内容实际是a所引用的内容,而对象a的类型是确定为A的(因已实例化了),所以b 的运行时类型就和a的类型相同了
如下代码所示:
class mm
以上代码中的对象b没什么好说的,运行时与编译时类型均为nn
而对象c的运行时类型为nn,编译时类型为mm
说说原因,因为对象b,c本身都是引用类型,在编译时对象c的类型由我们写的mm c来确定,而在程序运行后发现c引用的内容实际是b所引用的内容,而对象b的类型是确定为nn的(因已实例化了),所以c的运行时类型就和b的类型相同了。
对于非虚方法来说,调用哪个方法取决于该实例编译时的类型。
但对于虚方法来说,调用哪个方法取决于该实例运行时的类型。