C#中的运行时类型与编译时类型

今天在看C#参考时明白了 什么是C#的运行时类型与编译时类型,记录下来,以备查阅:

相信很多刚学C#的人都对这两个概念感到迷惑,其时并不难(以前太重于技术可用性,比如:asp.net中的DataDrid怎么用等问题,没大研究过这方面),希望能对C#初学者有所帮助。请看如下代码:

class  A
{...}

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
    {
        public void F()
        {
            Console.WriteLine("mm.F()\n");
        }

        public virtual void G()        //声明了一个虚方法
        {
            Console.WriteLine("mm.G()");
        }
    }
    class nn : mm
    {
        new  public void F()         //隐藏了父类的F方法
        {
            Console.WriteLine("nn.F()\n");
        }

        public override void G()        //重写了方法G
        {
            Console.WriteLine("nn.G()");
        }
    }
    class Test
    {
        static void Main()
        {
            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();
        }
    }

以上代码中的对象b没什么好说的,运行时与编译时类型均为nn

而对象c的运行时类型为nn,编译时类型为mm

说说原因,因为对象b,c本身都是引用类型,在编译时对象c的类型由我们写的mm c来确定,而在程序运行后发现c引用的内容实际是b所引用的内容,而对象b的类型是确定为nn的(因已实例化了),所以c的运行时类型就和b的类型相同了。

对于非虚方法来说,调用哪个方法取决于该实例编译时的类型

但对于虚方法来说,调用哪个方法取决于该实例运行时的类型


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值