C#方法重载详解(附带实例)
重载又叫做多载或多重定义,主要含义为同时有多个名称相同的方法时,C# 编译程序会依据方法所传递的参数数量或数据类型,选择符合的建构方法处理。
在正式讲解方法重载前,请先思考我们使用了许多次的 Console.WriteLine() 方法,读者应该发现不论我们传入什么类型的数据,都可以打印出正确的执行结果。
【实例 1】认识 Console.WriteLine() 的重载。
上述重载方法可以增加程序的可读性,也可以增加程序对于程序设计师与使用者的便利性,如果我们没有这个功能,就上述实例而言,我们就必须设计 5 种不同名称的打印方法,造成冗长的程序设计负荷与用户需熟记多种方法的负荷。
创建对象完成后,随即打印结果:
下面是本程序的说明图:
在上述执行结果中,如果没有为 MyClass 类对象的属性设置初始值,会使用 C# 默认的初始值,编译程序会为字符串变量赋值 null 作为初始值,为整数变量赋值 0 作为其初始值,所以当我们只有一个参数时,可以看到第 3 行会打印 name 的初值是 null,第 5 行会打印 age 的初值是 0。
建议程序设计时,可以增加一个不含参数的建构方法,这个方法可以设定没有参数时的默认值,这样未来程序可以有比较多的弹性。
【实例 2】重新设计实例 1,主要是增设没有参数时的默认值,让整个程序使用时更有弹性:
这个实例有 3 个相同名称的方法 Math,可以分别接受 1~3 个整数参数,如果只有 1 个整数参数则 x 等于该参数,如果有两个整数参数则 x 等于两个参数的积,如果有 3 个整数参数则 x 等于 3 个参数的积。
执行结果为:
在正式讲解方法重载前,请先思考我们使用了许多次的 Console.WriteLine() 方法,读者应该发现不论我们传入什么类型的数据,都可以打印出正确的执行结果。
【实例 1】认识 Console.WriteLine() 的重载。
char ch = 'A'; int num = 100; double e_pi = 3.14159; bool bo = true; string str = "C#"; Console.WriteLine(ch); Console.WriteLine(num); Console.WriteLine(pi); Console.WriteLine(bo); Console.WriteLine(str);执行结果为:
A
100
3.14159
True
C#

上述重载方法可以增加程序的可读性,也可以增加程序对于程序设计师与使用者的便利性,如果我们没有这个功能,就上述实例而言,我们就必须设计 5 种不同名称的打印方法,造成冗长的程序设计负荷与用户需熟记多种方法的负荷。
C#重载构造方法
将重载应用到构造方法中,看下面的实例程序:MyClass A = new MyClass(20); A.PrintInfo(); MyClass B = new MyClass("John"); B.PrintInfo(); MyClass C = new MyClass(25, "Lin"); C.PrintInfo(); public class MyClass { public int age; string name; public MyClass(int age) => this.age = age; public MyClass(string name) => this.name = name; public MyClass(int age, string name) { this.age = age; this.name = name; } public void PrintInfo() { Console.WriteLine($"{this.name,-5}:{this.age}"); } }程序中,建构方法有 3 个,分别是:
- 含有一个整数参数代表年龄的方法;
- 一个字符串参数代表姓名的方法;
- 含有两个参数,参数分别是整数参数代表年龄、字符串参数代表姓名的方法。
创建对象完成后,随即打印结果:
:20
John :0
Lin :25
下面是本程序的说明图:

在上述执行结果中,如果没有为 MyClass 类对象的属性设置初始值,会使用 C# 默认的初始值,编译程序会为字符串变量赋值 null 作为初始值,为整数变量赋值 0 作为其初始值,所以当我们只有一个参数时,可以看到第 3 行会打印 name 的初值是 null,第 5 行会打印 age 的初值是 0。
建议程序设计时,可以增加一个不含参数的建构方法,这个方法可以设定没有参数时的默认值,这样未来程序可以有比较多的弹性。
【实例 2】重新设计实例 1,主要是增设没有参数时的默认值,让整个程序使用时更有弹性:
MyClass A = new MyClass(); A.PrintInfo(); public class MyClass { public int age; string name; public MyClass() { this.age = 50; this.name = "Curry"; } public MyClass(int age) => this.age = age; public MyClass(string name) => this.name = name; public MyClass(int age, string name) { this.age = age; this.name = name; } public void PrintInfo() { Console.WriteLine($"{this.name,-5}:{this.age}"); } }执行结果
Curry:50
C#重载一般方法
将重载的概念应用在类内的一般方法上,实例如下:MyMath A = new MyMath(); A.Math(10); A.PrintInfo(); A.Math(10, 10); A.PrintInfo(); A.Math(10, 10, 10); A.PrintInfo(); public class MyMath { public int x; public void Math(int a) => this.x = a; public void Math(int a, int b) => this.x = a * b; public void Math(int a, int b, int c) => this.x = a * b * c; public void PrintInfo() => Console.WriteLine($"x = {this.x}"); }下面是本程序的说明图:

这个实例有 3 个相同名称的方法 Math,可以分别接受 1~3 个整数参数,如果只有 1 个整数参数则 x 等于该参数,如果有两个整数参数则 x 等于两个参数的积,如果有 3 个整数参数则 x 等于 3 个参数的积。
执行结果为:
x = 10
x = 100
x = 1000