在C#中,方法重载指的是在同一个类中定义多个同名方法,但这些方法的参数列表存在差异,编译器会根据调用时传入的参数匹配对应的方法执行。这种特性可以让开发者用同一个方法名处理不同类型的输入,提升代码的易用性。

基于参数类型不同的重载
这是最常见的重载方式,多个同名方法的参数个数相同,但参数的数据类型不同,编译器会根据传入参数的类型匹配对应的方法。
public class Calculator
{
// 处理两个整数相加
public int Add(int a, int b)
{
return a + b;
}
// 处理两个浮点数相加,参数个数和Add(int,int)相同,但类型不同
public double Add(double a, double b)
{
return a + b;
}
}
基于参数个数不同的重载
多个同名方法的参数类型可以相同,但参数的数量不同,这种方式也符合重载的规则。
public class Printer
{
// 打印单个字符串
public void Print(string content)
{
Console.WriteLine(content);
}
// 打印两个字符串,参数个数比Print(string)多一个
public void Print(string content1, string content2)
{
Console.WriteLine(content1 + content2);
}
}
基于参数顺序不同的重载
当方法的参数个数相同,但参数的排列顺序不同时,也可以构成重载,不过这种方式容易让调用者产生混淆,实际开发中要谨慎使用。
public class DataProcessor
{
// 第一个参数是字符串,第二个参数是整数
public void Process(string name, int age)
{
Console.WriteLine($"姓名:{name},年龄:{age}");
}
// 第一个参数是整数,第二个参数是字符串,参数顺序和上面的方法不同
public void Process(int age, string name)
{
Console.WriteLine($"年龄:{age},姓名:{name}");
}
}
使用params可变参数的重载
如果方法需要接收不定数量的同类型参数,可以使用params关键字定义可变参数,这种方式也可以和其他固定参数的重载方式共存。
public class SumHelper
{
// 计算两个整数的和
public int Sum(int a, int b)
{
return a + b;
}
// 计算多个整数的和,使用params接收可变数量的参数
public int Sum(params int[] numbers)
{
int total = 0;
foreach (int num in numbers)
{
total += num;
}
return total;
}
}
使用可选参数的重载
C#支持定义可选参数,即给参数设置默认值,调用时可以不传入该参数,这种方式可以替代部分需要定义多个重载方法的场景,但本质上可选参数和重载并不冲突,也可以和常规重载结合使用。
public class Greeter
{
// 可选参数,name默认值为"游客"
public void Greet(string name = "游客")
{
Console.WriteLine($"你好,{name}");
}
// 重载方法,接收两个参数,增加问候语前缀
public void Greet(string prefix, string name)
{
Console.WriteLine($"{prefix},{name}");
}
}
泛型方法的重载
泛型方法也可以进行重载,重载的规则和普通方法一致,主要差异在于泛型参数的约束或者泛型参数的个数不同。
public class GenericProcessor
{
// 无约束的泛型方法
public void Process<T>(T data)
{
Console.WriteLine($"处理数据:{data}");
}
// 泛型参数有约束,要求T实现IComparable接口,构成重载
public void Process<T>(T data) where T : IComparable
{
Console.WriteLine($"处理可比较数据:{data}");
}
// 两个泛型参数的方法,参数个数和上面的单泛型参数方法不同,构成重载
public void Process<T1, T2>(T1 data1, T2 data2)
{
Console.WriteLine($"处理两组数据:{data1},{data2}");
}
}
重载的注意事项
- 重载只和参数列表有关,和方法的返回值类型无关,仅返回值不同的同名方法不构成重载,编译时会报错。
- 重载方法的访问修饰符可以不同,比如一个方法是
public,另一个是private,只要参数列表符合要求就可以构成重载。 - 使用
params参数时,如果同时存在固定参数个数的重载,编译器会优先匹配固定参数的方法,只有没有匹配的固定参数方法时才会选择params参数的方法。 - 可选参数如果和重载方法同时存在,调用时要注意避免产生歧义,比如两个重载方法都可以通过省略参数匹配到,编译器会报错。