C# 学习笔记 16:拯救魔法数字的终极武器——枚举 (Enum)
开篇:皮皮的“加密”代码
皮皮(Pipi)正在复习他上个月写的角色控制器代码,结果发现一段“考古级”逻辑:
if (playerState == 1){ speed = 5; // 跑?}elseif (playerState == 2){ speed = 10; // 冲刺?还是飞?}elseif (playerState == 3) // 3 到底是个啥?!{ Die(); }
皮皮(抓头发):“救命啊!这个 1、2、3 到底是什么意思?我当时为什么不写注释?!”
瓜瓜(Guagua):“就算写了注释,每次敲代码还要去翻本子查数字,不觉得累吗?这种凭空出现、没人懂意义的数字,叫——魔法数字(Magic Number)。”
魔法数字的问题只有一个:它让代码失忆。
今天我们就用一把终极武器,彻底拯救它——枚举(Enum)。
第一关:什么是枚举?(Define an Enum)
枚举(Enumeration) 是一种值类型(Value Type), 它的核心作用只有一句话:
把冷冰冰的数字,变成人类能看懂的单词。
我们可以这样定义一个枚举:
// ✨ 定义一个枚举(注意:不是 class,而是 enum)publicenum PlayerState{ Idle, // 发呆 Run, // 跑 Attack, // 攻击 Dead // 死亡}
这相当于你为游戏创建了一本“小字典”。
以后谁再看到这些状态,不需要猜数字含义,只需要看单词。
第二关:用“类型”代替“数字”
以前皮皮这样写:
int playerState = 1;
现在我们可以直接升级成:
publicclassPlayer{// 不再是 int,而是枚举类型!public PlayerState State = PlayerState.Idle;publicvoidUpdate() {if (State == PlayerState.Run) { Console.WriteLine("玩家正在奔跑!"); }elseif (State == PlayerState.Dead) { Console.WriteLine("Game Over!"); } }}
代码瞬间变成“可阅读的英语句子”。
而且还有隐藏福利:
这就是“类型的力量”。
第三关:枚举的本质(Under the Hood)
虽然我们用的是单词,但电脑底层只认识数字。
枚举本质上是:
穿着单词马甲的 int
默认规则:
也就是:
强制脱马甲(类型转换)
有时我们需要把枚举和数字互相转换(比如存档)。
// 枚举 -> 数字int stateNumber = (int)PlayerState.Attack;Console.WriteLine(stateNumber); // 输出 2// 数字 -> 枚举int loadedData = 3;PlayerState loadedState = (PlayerState)loadedData;Console.WriteLine(loadedState); // 输出 Dead
⚠️ 注意: 如果数字是 999,也能强制转换成功,但这个值可能不在枚举定义里。
更安全的方式:
if (Enum.IsDefined(typeof(PlayerState), loadedData)){ PlayerState state = (PlayerState)loadedData;}
进阶:自定义数值
publicenum ErrorCode{ NotFound = 404, ServerCrash = 500, Unknown = 999}
枚举不仅能表示状态,还能表示:
- UI 页面类型

第四关:枚举的灵魂伴侣 —— switch
当状态很多时,if...else if... 会变得冗长。
这时候请召唤黄金搭档:
👫 Enum + switch
PlayerState currentState = PlayerState.Attack;switch (currentState){case PlayerState.Idle: Console.WriteLine("播放呼吸动画");break;case PlayerState.Run: Console.WriteLine("播放跑步动画");break;case PlayerState.Attack: Console.WriteLine("播放挥剑动画");break;case PlayerState.Dead: Console.WriteLine("播放倒地动画");break;default: Console.WriteLine("未知状态!");break;}
💡 小技巧:
在 Visual Studio 中:
switch (currentState)
然后按回车,IDE 会自动帮你补全所有 case。
效率直接起飞
思考进阶:如果状态能叠加呢?
问题来了:
如果角色:
普通枚举只能选一个值,那怎么办?
提示关键词:
[Flags]位运算
这叫做“位标志枚举”,我们会在进阶篇学习到。
今日战利品总结
下期预告
我们之前学过:
那问题来了:
如果我只想要一个小型数据结构,比如:
X, Y, Z 坐标
用 class 会不会太重?
下一期,我们将学习:
结构体(Struct)—— class 的轻量级双胞胎兄弟。
皮皮的内存优化之路,正式开始。