阿宝陪你学C#【函数(方法)】:面馆里的 “烹饪招式” 全解析
哈喽哇!各位编程小侠客们!我是你们的老朋友 —— 功夫熊猫阿宝!之前带大家认识了 C# 里类这个超厉害的 “菜品秘方”,今天咱们接着探索!要说类是秘方,那函数(方法)就是秘方里的 “烹饪招式”!在 C# 编程的江湖里,掌握函数(方法)就像我掌握了 “熊猫十八翻”,能把普通的数据食材,变成超厉害的 “代码美食”!快搬好小板凳,听我细细道来!
一、函数(方法):烹饪招式的神秘面纱
在 C# 的世界里,函数(方法)是类中定义的一段代码,专门用来执行特定的操作,就像面馆师傅们各有拿手的烹饪招式,有的擅长揉面,有的擅长调汤。你可以把函数(方法)想象成一个 “代码小助手”,只要你一声令下,它就会按照设定好的步骤去完成任务,比如计算面条的价格、打印订单信息等等。
在类里面,我们这样定义一个简单的方法:
class NoodleShop
{
public void WelcomeCustomer()
{
Console.WriteLine("欢迎光临阿宝的面馆!快来尝尝美味的面条吧!");
}
}
在上面的代码中,WelcomeCustomer
就是一个方法,它属于NoodleShop
类。public
是访问修饰符,决定了这个方法能不能被外面的代码调用;void
表示这个方法执行完后不会返回任何结果,就像师傅热情招呼顾客,不需要顾客给啥 “回报”;方法名后面的小括号()
,在后面我们会讲到它的大用处!
二、函数(方法)的 “招式分解”:参数与返回值
2.1 参数:烹饪所需的 “食材清单”
就像师傅做菜需要准备好各种食材,很多方法也需要 “食材”—— 参数,才能完成任务。参数是方法接收外部数据的 “小窗口”,把需要处理的数据传递给方法。
比如,我们要定义一个计算面条总价的方法,就需要知道面条的单价和数量:
class NoodleShop
{
public decimal CalculateTotalPrice(decimal unitPrice, int quantity)
{
return unitPrice * quantity;
}
}
在CalculateTotalPrice
方法中,decimal unitPrice
和int quantity
就是参数,它们就像告诉师傅 “面条单价是多少”“顾客点了几碗”。当我们调用这个方法时,就要按照顺序 “递上” 这些参数:
NoodleShop shop = new NoodleShop();
decimal total = shop.CalculateTotalPrice(18.00m, 3);
Console.WriteLine($"面条总价是:{total}元");
这里的18.00m
和3
,就是实际传递给方法的参数值,方法拿到这些值后,就能算出总价啦!
2.2 返回值:烹饪完成的 “美味成果”
很多时候,方法执行完任务后,会给我们带回 “成果”,这就是返回值。就像师傅做完菜,会端上一盘香喷喷的美食。在方法定义中,返回值类型告诉我们这个方法执行完会 “端回” 什么类型的数据。
上面的CalculateTotalPrice
方法,返回值类型是decimal
,表示它计算完后会返回一个小数类型的总价。方法里用return
关键字把计算好的结果 “送出来”,调用方法的代码就能接住这个结果进行下一步操作啦。
如果方法不需要返回任何结果,就像前面的WelcomeCustomer
方法,返回值类型就是void
,这种方法里可以没有return
语句,或者用return;
直接结束方法执行。
三、函数(方法)的 “进阶招式”
3.1 方法重载:同一招式的不同变化
在面馆里,师傅们同样的揉面招式,根据不同的面团,手法会有些变化。在 C# 里,方法重载就像这样,同一个类中可以有多个名字相同,但参数列表不同的方法。
比如,我们的面馆推出了新活动,针对不同顾客有不同的计算总价方式:
class NoodleShop
{
public decimal CalculateTotalPrice(decimal unitPrice, int quantity)
{
return unitPrice * quantity;
}
public decimal CalculateTotalPrice(decimal unitPrice, int quantity, decimal discount)
{
decimal originalPrice = unitPrice * quantity;
return originalPrice * (1 - discount);
}
}
这里有两个CalculateTotalPrice
方法,第一个方法只根据单价和数量计算总价,第二个方法多了一个discount
(折扣)参数,能计算打折后的价格。编译器会根据我们调用方法时传递的参数个数和类型,自动选择合适的方法,就像师傅根据面团情况,自动切换揉面手法!
3.2 递归方法:自己调用自己的 “神奇循环”
递归方法就像面馆里的 “无限传送带”,一个方法会自己调用自己,不过得有个 “刹车” 条件,不然就会一直转下去,程序可就 “晕头转向” 啦!
我们用递归方法来计算面条的 “累计制作数量”,假设每做一碗面,累计数量就增加,直到达到目标数量:
class NoodleShop
{
public int CalculateTotalMade(int targetCount, int currentCount = 0)
{
if (currentCount == targetCount)
{
return currentCount;
}
return CalculateTotalMade(targetCount, currentCount + 1);
}
}
在这个CalculateTotalMade
方法中,每次调用自己时,currentCount
都会增加,当currentCount
等于targetCount
时,就停止递归,返回最终的累计数量。就像传送带送到目标位置,就自动停下!
3.3 扩展方法:给已有类 “偷师学艺”
扩展方法就像面馆的师傅向隔壁糕点店 “偷师”,给原本的类增加新的 “招式”,却不用修改原来类的代码!
假设我们有一个Noodle
类,现在想给它增加一个判断面条是否煮好的方法:
static class NoodleExtensions
{
public static bool IsNoodleCooked(this Noodle noodle, int cookingTime)
{
// 这里简单假设煮5分钟就好
return cookingTime >= 5;
}
}
class Noodle
{
// 类的其他成员省略
}
在NoodleExtensions
静态类中定义的IsNoodleCooked
就是扩展方法,this Noodle noodle
是关键,它表示这个方法是给Noodle
类 “扩展” 的。这样,我们就能像调用Noodle
类原本的方法一样使用它了:
Noodle myNoodle = new Noodle();
bool isCooked = myNoodle.IsNoodleCooked(6);
Console.WriteLine($"面条煮好了吗?{isCooked}");
四、函数(方法)的 “隐藏规则”
4.1 作用域与生命周期
方法里定义的变量,就像厨房里临时用的工具,出了这个方法 “地盘”(作用域),就不能用了。比如在方法里定义的int tempCount = 0;
,方法执行完,tempCount
就 “消失” 了,下次再调用方法,它又得重新 “出生”。
4.2 访问修饰符的 “权限密码”
前面提到的public
只是访问修饰符的一种,还有private
(只有类内部能用,就像面馆的秘制酱料配方)、protected
(类和它的子类能用,像家族传承的烹饪技巧)等等。合理设置访问修饰符,能保护我们的代码 “秘方”,防止被随意乱用!
4.3 与类和对象的 “亲密关系”
实例方法需要通过类的对象来调用,就像只有真正的面馆师傅,才能施展烹饪招式;静态方法属于类本身,不需要创建对象,直接用类名就能调用,比如面馆的 “开店公告”,不需要具体哪个师傅,大家都知道。
五、总结:成为 “烹饪招式” 大师
到这里,C# 里函数(方法)的各种 “烹饪招式” 就都给大家展示完啦!从基础的参数、返回值,到进阶的重载、递归、扩展方法,每一种都有独特的用处。记住,函数(方法)是让代码动起来的关键,就像烹饪招式是做出美食的核心!
下次在编程江湖里闯荡,大胆运用这些招式,把数据食材变成超酷的 “代码大餐”!要是遇到啥 “卡壳” 的地方,别犹豫,来我的面馆,咱们边吃面条边研究!说不定吃着吃着,灵感就像面条一样,“嗖” 地一下全冒出来啦!