首先我们说一下什么是方法重载。在面对对象这样的高级语言中都允许我们在一个类中定义多个方法名相同、方法间参数个数和参数顺序不同的方法,对于参数个数不同或者参数列表不同的情况我们称之为参数列表不同。需要注意的是这里没有提到方法的返回值。也就是决定方法是否构成重载有两个条件:
对于上面的代码,(1)没有参数,(2)使用了一个int类型的参数,(1)和(2)之间就构成了重载。(2)与(3)相比仅仅返回值不同,虽然重载不关心返回值的不同,但是在C#中不允许存在方法名和参数列表相同、返回值不同的方法,所以(2)和(3)不能同时存在于代码中,(3)如果不注释掉上面的代码是没有办法通过编译的。 上面我们仅仅讨论了重载的一些基本常识,下面我们探讨一下一些情况稍微复杂的重载情况。 首先我们看第一个版本:
大家猜猜这个程序的运行结果是什么? 对以上代码进行分析,我们发现Show()方法有两种形式,一种是string类型的参数,一种是object类型参数,在一个类中存在方法名相同、参数列表不同(参数个数或者参数类型不同)的现象我们称之为overloading,即重载。不过这里的Show()方法的参数比较特殊,因为string类继承于Object类,也就是Show()方法的参数存在一种继承关系。从结果我们可以得出两点结论: .method private hidebysig static void Main(string[] args) cil managed 从上面的IL代码我们可以看出对于string s=null;这句代码在IL中表示为:ldnull。 再根据上面的结论,我们看下面的代码:
猜猜上面的代码执行结果会是怎样的? 从上面的运行结果我们可以得出以下结论:
如果上面的假设成立,上面的代码运行结果应该如下: (3)为什么Show(1)会调用static void Show(Object o)这个方法呢?在这个类中与Show(1)最精确的方法重载应该是static void Show(int i)这种方法声明,但是方法中没有,因为int是继承自ValueType类,所以如果没有static void Show(int i)这种声明,那么其次接近的声明应该是static void Show(ValueType v)这种声明,可惜方法中依然没有,不过ValueType类继承自Object类,所以比static void Show(ValueType v)还次一点的方法重载声明应该是static void Show(Object o),而类中也确实存在这种声明,所以会调用static void Show(Object o)这个方法。当然从int到Object这个过程中存在一次box,也就是装箱(装箱是从值类型到引用类型的转换),这个可以从下面的IL代码可以看出来。 以下是第二种情况下Main()方法的IL代码: 下面我们对第二种情况的代码做一些变化,代码如下:
上面的代码的运行结果是什么,你能猜出来吗? 附注:最近尝试将一些比较基础的理论的知识用比较浅显的话语表达出来,主要是为了方便初学者理解和学习,也许某些词语用得不够professional,,但是如果词语太professional了怕初学者理解起来有困难,敬请各位大侠谅解,因为本文不是为你们写的。同时也欢迎各位与我交流经验和心得。最近垃圾邮件太多,所以不便在这里公开我的email,如果各位有兴趣与我交流,请加我为csdn好友,这样就能看见我的QQ和email了. |
|