概念
编译时顾名思义就是正在编译的时候。那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码。(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言。比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL。另外还有链接器、汇编器。为了了便于理解我们可以统称为编译器)
那编译时就是简单的作一些翻译工作,比如检查你有没有粗心写错啥关键字了啊。有啥词法分析,语法分析之类的过程。就像个老师检查学生的作文中有没有错别字和病句一样。如果发现啥错误编译器就告诉你。如果你用微软的VS的话,点下build。那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的。所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态就是没把代码放内存中运行起来,而只是把代码当作文本来扫描下)。
所谓运行时就是代码跑起来了。被装载到内存中去了。(你的代码保存在磁盘上没装入内存之前是个死家伙。只有跑到内存中才变成活的)。而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样。不是简单的扫描代码。而是在内存中做些操作,做些判断。 代码 为了更加直观的理解编译时和运行时的区别,我们看以下代码: - class Program
- {
- static void Main(string[] args)
- {
- mm a = new mm();
- nn b = new nn();//实例化一个nn的对象b
- mm c = b; //把mm的对象c指向b
- Console.WriteLine("非虚方法");
- a.F();
- b.F();
- c.F();
- Console.WriteLine("虚方法");
- a.G();
- b.G();
- c.G();
- Console.ReadKey();
- }
- }
- class mm
- {
- public void F()
- {
- Console.WriteLine("mm.F()");
- }
- public virtual void G() //声明了一个虚方法
- {
- Console.WriteLine("mm.G()");
- }
- }
- class nn : mm
- {
- new public void F() //隐藏了父类的F方法
- {
- Console.WriteLine("nn.F()");
- }
- public override void G() //重写了方法G
- {
- Console.WriteLine("nn.G()");
- }
- }
复制代码
|