C#基础学习(七)函数的重载

试想你有一段代码,你可以用来做两个数的加法,但是现在需要求三个数的加法,你是否需要重新写一段和以前相似的代码呢。答案是不用的,因为你们要实现的功能是一样的,只是传入的参数不同而已,你完全可以复用同一段代码,只需要修改传入参数即可。所以有了今天的主角,函数的重载

​​​​​​//重载概念
//在同一语句块中(class或者struct)中
//函数(方法)名相同
//参数的数量不同
//或者
//参数的数量相同,但参数的类型或者顺序不同

//作用:
//1.命名一组功能相似的函数,减少函数名的数量,避免命名空间的污染
//2.提升程序可读性

//注意:
//1.重载和返回值类型无关,只和参数类型,个数,顺序有关
//2.调用时 程序会自己根据传入的参数类型判断使用哪一个重载

几个示例:

示例1:参数数量不同

cs 复制代码
static int Add(int a, int b)
{
    return a + b;
}

static int Add(int a, int b, int c)
{
    return a + b + c;
}

使用:

cs 复制代码
Console.WriteLine(Add(2, 3));       // 输出 5
Console.WriteLine(Add(1, 2, 3));     // 输出 6

说明:通过增加参数数量实现重载,编译器根据实参个数选择匹配的方法。

示例2:参数类型不同

cs 复制代码
static int Add(int a, int b)
{
    return a + b;
}

static float Add(float a, float b)
{
    return a + b;
}

使用:

cs 复制代码
Console.WriteLine(Add(2, 3));        // 调用int版本,输出5
Console.WriteLine(Add(1.5f, 2.3f));  // 调用float版本,输出3.8

说明:参数类型不同时,即使方法名相同,也会被视为不同重载。

示例3:参数顺序不同

cs 复制代码
static string Combine(int id, string name)
{
    return $"ID:{id}, Name:{name}";
}

static string Combine(string name, int id)
{
    return $"Name:{name}, ID:{id}";
}

使用:

cs 复制代码
Console.WriteLine(Combine(101, "Alice"));  // 输出 "ID:101, Name:Alice"
Console.WriteLine(Combine("Bob", 102));   // 输出 "Name:Bob, ID:102"

说明:参数顺序不同是合法的重载方式,常用于不同语义的场景。

示例4:refout 关键字

cs 复制代码
static void Update(ref int x)
{
    x += 10;
}

static void Update(out int x)
{
    x = 20;  // out必须在方法内赋值
}

使用:

cs 复制代码
int num = 5;
Update(ref num);  // num变为15

int newNum;
Update(out newNum); // newNum被赋值为20

说明refout修饰的参数会被视为不同类型,因此可以重载。但仅通过refout无法单独构成重载(需参数类型不同)。

反例:返回值不同不构成重载

cs 复制代码
// 错误示例!编译报错
static int GetValue() { return 42; }
static string GetValue() { return "Hello"; }

仅返回值不同不构成函数重载

总结:函数重载的优势

  1. 代码简洁 :相同逻辑的方法共享一个名称(如Add),无需为不同类型单独命名(如AddIntAddFloat)。
  2. 可读性强:通过参数列表清晰表达方法的使用场景。
  3. 灵活扩展:后续新增参数类型或数量时,不影响已有代码。

注意事项 :避免设计歧义性重载(如Add(int, float)Add(float, int)同时存在时,Add(5, 5)会因5可隐式转为float导致编译错误)。

相关推荐
薛先生_0991 小时前
js学习语法第一天
开发语言·javascript·学习
故事不长丨2 小时前
WPF MvvmLight 超详细使用教程
c#·wpf·mvvm·mvvmlight
寒秋花开曾相惜4 小时前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
是翔仔呐5 小时前
第11章 显示外设驱动:I2C协议OLED屏、SPI协议LCD屏字符/图片/中文显示
c语言·开发语言·stm32·单片机·嵌入式硬件·学习·gitee
_李小白5 小时前
【AI大模型学习笔记之平台篇】第五篇:Trae常用模型介绍与性能对比
人工智能·笔记·学习
CSharp精选营5 小时前
值类型与引用类型:别再只背“栈和堆”了,看这 4 个实际影响
c#·.net·值类型·引用类型·栈和堆·编程指南
承渊政道5 小时前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio
AI-Ming5 小时前
程序员转行学习 AI 大模型: 踩坑记录:服务器内存不够,程序被killed
服务器·人工智能·python·gpt·深度学习·学习·agi
m0_716765235 小时前
C++提高编程--STL常用容器(set/multiset、map/multimap容器)详解
java·开发语言·c++·经验分享·学习·青少年编程·visual studio
2501_945318496 小时前
零基础学习AI的选型指南:CAIE认证与编程型AI认证如何取舍
人工智能·学习