C# 方法重载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c#方法重载
2008-11-14 14:27
首先我们说一下什么是方法重载。在面对对象这样的高级语言中都允许我们在一个类中定义多个方法名相同、方法间参数个数和参数顺序不同的方法,对于参数个数不同或者参数列表不同的情况我们称之为参数列表不同。需要注意的是这里没有提到方法的返回值。也就是决定方法是否构成重载有两个条件:
(1)在同一个类中;
(2)方法名相同;
(3)参数列表不同。
例如下面的代码:
1. public void Show()//(1)
2. {
3. Console.WriteLine("Nothing");
4. }
5.
6. public void Show(int number)//(2)
7. {
8. Console.WriteLine(number);
9. }
10. /*
11. public int Show(int number)//(3)
12. {
13. Console.WriteLine(number);
14. return number % 5;
15. }
16. */
对于上面的代码,(1)没有参数,(2)使用了一个int类型的参数,(1)和(2)之间就构成了重载。(2)与(3)相比仅仅返回值不同,虽然重载不关心返回值的不同,但是在C#中不允许存在方法名和参数列表相同、返回值不同的方法,所以(2)和(3)不能同时存在于代码中,(3)如果不注释掉上面的代码是没有办法通过编译的。
上面我们仅仅讨论了重载的一些基本常识,下面我们探讨一下一些情况稍微复杂的重载情况。
首先我们看第一个版本:
ing System;
ing System.Collections.Generic;
ing System.Text;
4.
space OverrideDemo
6.{
7. ///
8. /// 说明:本实例用于讲述重载的关系
9. /// 作者:周公
10. /// 日期:2008-09-04
11. /// 首发地址:/zhoufoxcn
12. ///
13. class Program
14. {
15. static void Main(string[] args)
16. {
17. String s = null;
18. Show(s);
19. Object o = "123";
20. Show(o);
21. }
22.
23. static void Show(string s)
24. {
25. Console.WriteLine("String");
26. }
27.
28. static void Show(Object o)
29. {
30. Console.WriteLine("Object");
31. }
32. }
33.}
大家猜猜这个程序的运行结果是什么?
以下是程序运行结果:
String
Object
对以上代码进行分析,我们发现Show()方法有两种形式,一种是string类型的参数,一种是object类型参数,在一个类中存在方法名相同、参数列表不同(参数个数或者参数类型不同)的现象我们称之为overloading,即重载。不过这里的Show()方法的参数比较特殊,因为string类继承于Object类,也就是Show()方法的参数存在一种继承关系。从结果我们可以得出两点结论:
(1)从String s = null;Show(s);最后调用的是static void Show(string s)这个方法我们可以得出,C#中方法调用是精确匹配的,也就是s是string类型,虽然string类型继承自object类型,尽管static void Show(Object o)也满足条件,但是方法声明中static void Show(string s)这个声明与s类型的最接近(因为s是string类型,与它最接近),所以执行static void Show(string s),而不执行static void
Show(Object o)这个方法。
(2)从Object o = "123"; Show(o);最后调用的是static void Show(Object o)这个方法我们可以得出,C#中如果存在方法重载,会根据其refrence type(引用类型)来调用对象的方法,而不是根据instance type (实例类型)来调用。尽管”123”是string类型,但是它的refrence type是object类型的,所以会调用static void Show(Object o)这个方法而不是static void Show(string s)。
上面的Main()方法的IL代码如下:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 24 (0x18)
.maxstack 1
.locals init ([0] string s,
[1] object o)
IL_0000: nop