C# 学习笔记 06:对象的出生证明:构造函数(Constructor)
开篇:皮皮的「次品工厂」
皮皮最近很烦。
他已经会写 Monster 类了, 但总是忘东忘西。
有时候怪物 new 出来了, 却忘了给它设血量。
结果游戏一跑—— 勇者一刀下去,怪物当场消失。 不是被秒,是血量默认 0。
皮皮崩溃了:
“能不能让怪物一出生就有血量? 我不想再造这种半成品了!”
瓜瓜点点头:
“可以。 给它们办张出生证明就行。”
这个东西,
叫 构造函数(Constructor)。
第一关:构造函数到底是干嘛的?
回忆一下我们之前的流程:
// 🚫 旧时代:先出生,再补手续Monster m = new Monster(); // 空壳m.Name = "史莱姆";m.Hp = 100;
问题很明显:
构造函数解决的就是这个问题。
一句话解释:
构造函数 = 对象在 new 的那一刻,自动执行的初始化代码。
构造函数的两个死规矩
它长得像方法, 但规矩很怪:
publicclassMonster{publicstring Name;publicint Hp;// 👶 出生瞬间自动执行publicMonster(string name, int hp) { Name = name; Hp = hp; Console.WriteLine($"{Name} 诞生了,血量 {Hp}"); }}
从这一刻开始, 怪物不可能再“裸奔出生”。
第二关:一气呵成的召唤
现在皮皮召唤怪物,只需要一句话:
Monster boss = new Monster("魔王", 1000);
发生了什么?
而且很关键的一点:
// Monster m = new Monster(); // ❌ 报错
这行现在不允许了。
原因很简单:
你定义了构造函数, 编译器就要求你必须按规则投料。
🧙♂️ 瓜瓜的比喻:
构造函数就是工厂入口。 不给参数, 不给你出货。

第三关:不同出生套餐(重载)
皮皮很快又不满意了:
“大多数时候我只想要个杂兵, 每次都写 new Monster("杂兵", 50) 好累。”
这个需求很真实。
解决办法是一个老朋友的新用法: 👉 重载(Overloading)
规则只有一条:
同名方法,参数不同,就是不同版本。
构造函数也可以有多个:
publicclassMonster{publicstring Name;publicint Hp;// 套餐 A:自定义publicMonster(string name, int hp) { Name = name; Hp = hp; }// 套餐 B:默认杂兵publicMonster() { Name = "普通史莱姆"; Hp = 10; }}
现在怎么用都行:
Monster boss = new Monster("魔王", 9999);Monster mob = new Monster(); // 自动走默认套餐
编译器会根据你传的参数,自己选该用哪一个构造函数。
你不用管。
本期总结
到这里,我们已经掌握了对象出生的完整流程:
这一步之后, 你的代码会明显更稳、更干净。
课后思考(重要)
如果构造函数参数也叫 Name, 属性也叫 Name:
publicMonster(string Name){ Name = Name; // 😵}
这里到底谁是谁?
C# 提供了一个关键字:this用来指代当前对象自己。
你知道该怎么写吗?
下期预告
皮皮看着自己的 Monster 类,又犯愁了。
“我要做龙、做僵尸、做骷髅。 它们都有名字、有血量, 难道要全部复制一份?”
不用。
下一期,我们学习👉继承(Inheritance)
父与子的羁绊, 让代码量直接砍半。