首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

虚方法调用产生IL代码,有一处不太明白,

2013-09-07 
虚方法调用产生IL代码,有一处不太明白,求助!!!using Systemusing System.Collections.Genericusing Syst

虚方法调用产生IL代码,有一处不太明白,求助!!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConstDomain;

namespace CLRConst
{
    public class A
    {
        public virtual void Print()
        {
            Console.WriteLine("A Print");
        }
    }
    public class B : A
    {

    }
    public class C : B
    {
        public override void Print()
        {
            Console.WriteLine("B Print");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A();
            a.Print(); //IL代码:callvirt   instance void CLRConst.A::Print()
            A b = new C();
            b.Print();//IL代码:callvirt   instance void CLRConst.A::Print()
            C c = new C();
            c.Print();//IL代码:callvirt   instance void CLRConst.A::Print() 这里有不理解
            Console.Read();
        }
    }
}

对于a.Print()和b.Print()的IL代码没有异议,编译器只关心变量声明类型(都是A)所以可以调用Print
其后编译器发现Print是虚方法,因此调用指令为callvirt
所以产生的IL代码 :callvirt(虚调用)   instance void CLRConst.A(变量类型都是A)::Print() 是可以理解的。
但是对于 C c=new C();c.Print()的IL代码有点不明白,编译器关心声明类型(这里是C)
所以我觉得产生的指令应该是:callvirt   instance void CLRConst.C

::Print()
我知道我肯定是错的,想求助一下
callvirt   instance void TYPE::Print()
这个TYPE并不是以声明类型为准的,而是以这个虚方法最开始定义处的类型为准(这里是A)吗?


     C# 虚方法
[解决办法]
什么叫继承,什么叫重写
C哪有Print方法,C的Print只是重写A的而已。
public new void Print()
这样C才会有Print方法
[解决办法]
既然是虚方法,自然是从基类开始搜索的。

热点排行