阿宝陪你学C#【类的高级应用】:面馆经营的 “绝密进阶手册”
嘿哟嘿哟!各位编程江湖的小伙伴们,我是你们的好朋友阿宝!前面带大家学了不少 C# 的 “功夫招式”,从类型食材到函数烹饪,那可都是基础中的基础!今天咱们直接放大招,翻开 C# 类的 “绝密进阶手册”—— 类的高级应用!这就好比经营面馆,光会煮面可不够,还得学会管理秘方、调配资源、服务顾客!快跟上,看我给你细细拆解!
一、成员修饰符:面馆规矩的 “守护者”
在我们面馆里,有些规矩是给所有顾客看的,有些是只有后厨知道的秘密。C# 里的成员修饰符,就是给类成员设定这些 “规矩” 的!
public
:敞开大门的招牌菜:用public
修饰的成员,就像面馆门口大大的招牌,所有人都能看到、都能享用。比如public void ShowMenu()
方法,外面的顾客随时可以调用它查看菜单。private
:锁在保险柜里的秘制酱料:private
修饰的成员,藏得严严实实,只有类自己能访问。像private string secretRecipe
,记录着独家面条酱料配方,绝不能被外人拿到!protected
:家族传承的特殊手艺:protected
修饰的成员,就像只传给面馆家族后辈的特殊揉面手法,类本身和它的子类可以使用。internal
:店内员工的专属规则:internal
修饰的成员,只有同一个程序集(可以理解为同一家连锁面馆的不同分店)内的代码能访问,对外保密!
class NoodleShop
{
public void OpenShop() { /* 开店营业 */ }
private string specialSauce = "绝密酱料配方";
protected void TeachCraft() { /* 传授手艺 */ }
internal void StaffOnlyOperation() { /* 员工专属操作 */ }
}
二、实例类成员 vs 静态成员:面馆里的 “个人绝活” 与 “公共设施”
2.1 实例类成员:每个师傅的 “个人绝活”
实例类成员就像面馆里每位师傅的独特烹饪手法,必须先 “请” 出这位师傅(创建对象),才能施展。比如每个面条订单对象都有自己的CalculateOrderPrice()
方法,根据顾客点的不同面条算出价格。
class NoodleOrder
{
public decimal CalculateOrderPrice()
{
// 根据订单内容计算价格
return 0;
}
}
NoodleOrder order1 = new NoodleOrder();
decimal price1 = order1.CalculateOrderPrice();
2.2 静态成员:面馆里的 “公共设施”
静态成员属于整个面馆(类),不需要特定的师傅(对象)就能使用。比如NoodleShop.TotalCustomers
静态字段,记录着进店的总顾客数;NoodleShop.ShowOpeningHours()
静态方法,随时能告诉大家面馆的营业时间。
class NoodleShop
{
public static int TotalCustomers = 0;
public static void ShowOpeningHours()
{
Console.WriteLine("营业时间:早8点 - 晚10点");
}
}
NoodleShop.ShowOpeningHours();
Console.WriteLine($"总顾客数:{NoodleShop.TotalCustomers}");
三、成员常量 vs 静态量:面馆里的 “固定招牌” 与 “可更新公告”
3.1 成员常量:雷打不动的 “固定招牌”
常量就像面馆门口永远不变的招牌,一旦定义,绝不能修改!比如const string SHOP_NAME = "阿宝的功夫面馆"
,从开店起就定下名字,谁也改不了!
class NoodleShop
{
public const string SHOP_NAME = "阿宝的功夫面馆";
}
3.2 静态量:可以更新的 “公告栏”
静态变量虽然也属于类,但它的值可以像面馆的每日优惠公告一样,随时更新。比如static decimal TodayDiscount = 0.8m;
,每天的折扣能根据活动调整。
class NoodleShop
{
public static decimal TodayDiscount = 1.0m;
}
对比:
- 常量是 “铁打的营盘”,值永远固定;
- 静态变量是 “流水的兵”,能按需改变,就像固定招牌和可更新公告的区别!
四、属性:食材的 “精致包装” 与 “智能管家”
属性就像面馆里食材的精致包装盒,不仅能存放数据,还能设置 “取用规则”!比如NoodleDish
类的Price
属性,既能获取价格,又能在设置价格时检查是否合理。
class NoodleDish
{
private decimal price;
public decimal Price
{
get { return price; }
set
{
if (value > 0)
{
price = value;
}
else
{
Console.WriteLine("价格不能为负数!");
}
}
}
}
NoodleDish dish = new NoodleDish();
dish.Price = 28; // 正常设置
dish.Price = -5; // 触发检查提示
五、构造函数:菜品的 “诞生仪式” 与 “开店准备”
5.1 实例构造函数:每道菜品的 “诞生仪式”
实例构造函数就像面馆里每道新菜品的诞生仪式,创建对象时自动启动,给对象设置初始状态。比如NoodleDish(string name, decimal price)
构造函数,创建面条菜品时,就给它取好名字、定好价格。
class NoodleDish
{
public string Name { get; set; }
public decimal Price { get; set; }
public NoodleDish(string name, decimal price)
{
Name = name;
Price = price;
Console.WriteLine($"新菜品 {Name} 诞生!");
}
}
NoodleDish beefNoodle = new NoodleDish("招牌牛肉面", 32);
5.2 静态构造函数:面馆的 “开店准备”
静态构造函数只在类第一次被使用时执行一次,就像面馆每天开店前的准备工作,打扫卫生、准备食材。比如NoodleShop
类的静态构造函数,初始化一些静态数据。
class NoodleShop
{
public static int TotalTables;
static NoodleShop()
{
TotalTables = 10; // 初始化桌子数量
Console.WriteLine("面馆开始营业前准备...");
}
}
六、对象初始化语句:快速 “组装” 菜品
对象初始化语句就像面馆的 “快速点餐” 服务,创建对象时能同时设置多个属性,不用分好几步!
class NoodleDish
{
public string Name { get; set; }
public decimal Price { get; set; }
}
NoodleDish spicyNoodle = new NoodleDish { Name = "麻辣小面", Price = 22 };
七、析构函数:对象的 “谢幕演出”
析构函数是对象的 “谢幕演出”,当对象不再被使用,要被垃圾回收时,它就会执行。比如NoodleOrder
类的析构函数,在订单处理完后,清理相关资源。
class NoodleOrder
{
~NoodleOrder()
{
Console.WriteLine("订单已完成,清理资源...");
}
}
八、readonly
修饰符:只能看不能改的 “珍贵食谱”
readonly
修饰的字段就像面馆里只能看不能改的珍贵食谱,在构造函数里赋值后,就再也不能修改!比如readonly string shopAddress
,记录面馆地址,确定后不能随意变动。
class NoodleShop
{
public readonly string shopAddress;
public NoodleShop(string address)
{
shopAddress = address;
}
}
九、this
关键字:指向 “自己” 的 “面馆掌柜”
this
关键字就像面馆掌柜指向自己,在类的方法里,用它明确表示访问类自己的成员。比如NoodleShop
类的方法里,this.TotalCustomers
就表示访问当前面馆对象的总顾客数字段。
class NoodleShop
{
public int TotalCustomers;
public void IncreaseCustomerCount()
{
this.TotalCustomers++;
}
}
十、索引器:菜品清单的 “快速查找窗口”
索引器就像面馆菜品清单的快速查找窗口,通过类似数组下标的方式,快速访问类里的元素。比如NoodleShop
类的索引器,能快速获取不同位置的菜品。
class NoodleShop
{
private NoodleDish[] dishes = new NoodleDish[3];
public NoodleDish this[int index]
{
get { return dishes[index]; }
set { dishes[index] = value; }
}
}
NoodleShop shop = new NoodleShop();
shop[0] = new NoodleDish("清汤面", 18);
NoodleDish dish = shop[0];
十一、分部类和分部方法:多人协作的 “面馆扩建工程”
分部类和分部方法就像面馆的扩建工程,多个程序员可以分工合作,分别编写类的不同部分,最后合在一起就是完整的类!
// 文件1:NoodleShop_Part1.cs
partial class NoodleShop
{
public void OpenShop() { /* 开店逻辑 */ }
}
// 文件2:NoodleShop_Part2.cs
partial class NoodleShop
{
public void CloseShop() { /* 关店逻辑 */ }
}
十二、总结:成为面馆经营 “大掌柜”
到这儿,C# 类的高级应用知识就全部解锁啦!从成员修饰符的规矩设定,到索引器的快速查找,每一个知识点都像面馆经营的关键技能!掌握这些,你就从 “面条师傅” 升级成 “面馆大掌柜” 啦!下次在编程江湖里遇到复杂问题,大胆运用这些 “进阶秘籍”,保准轻松拿下!要是还有疑惑,别客气,来我的面馆,咱们边吃边聊!