C#中的枚举
/最后的逗号可写可不写。最前面可以加访问修饰符如public,private等。
一、枚举的基本概念
在 C# 中,枚举(Enum) 是一种用于定义 命名常量集合 的数据类型,它将一组相关的固定值用有意义的名字表示,使代码更易读、更安全。简单来说,枚举是被命名的整型常量的集合,虽然被命名,但实际上还是int数字,默认初始化为0。
1、作用
帮助我们清晰的分清楚命名的含义,比起0,1,2等数字,直接起个名字会更利于清楚他们的含义。
2、语法
(1)声明枚举类型:
(关键字)enum (枚举名字)E_MyEnum { 自定义枚举名字1,自定义枚举名字2}
//最后的逗号可写可不写。最前面可以加访问修饰符如public,private等
示例:
// 声明一个名为 "Season" 的枚举类型
public enum Season
{
Spring, // 默认值0
Summer, // 1
Autumn, // 2
Winter // 3
}
// 声明一个带自定义值的枚举类型
enum E_自定义名字
{
自定义枚举名字 = 200,
自定义枚举名字1, //值为200+1
自定义枚举名字2 =500,
自定义枚举名字3, //值为500+1
}
(2)声明枚举变量
(枚举名字)E_MyEnum (自定义一个变量)myEnum = (枚举名字)E_MyEnum.值
示例:
namespace MyApplication
{
// 在命名空间中声明枚举
public enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
public class Program
{
public static void Main()
{
//声明枚举变量
DayOfWeek today = DayOfWeek.Monday;
Console.WriteLine(today);
}
}
}
3、位置
一般在声明在namespace,或class,struct结构体语句中,不能在函数语句块中声明。
(枚举是一种类型,而类型不能在方法中声明。方法是代码的执行单元,而类型需要在更高级别的作用域(如命名空间、类或结构体)中声明,以便在整个程序中可用。)
1.直接声明在命名空间中
将枚举直接声明在命名空间中,这样它可以在整个项目中被访问。这是最常见的声明方式。
namespace MyApplication
{
// 在命名空间中声明枚举
public enum DayOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
public class Program
{
public static void Main()
{
DayOfWeek today = DayOfWeek.Monday;
Console.WriteLine(today);
}
}
}
2.在类或结构体中声明
枚举也可以声明在类或结构体中,这样它只能在该类或结构体的作用域内访问。
namespace MyApplication
{
public class Program
{
// 在类中声明枚举
public enum PlayerStatus
{
Alive,
Dead,
Sleeping
}
public static void Main()
{
PlayerStatus currentPlayerStatus = PlayerStatus.Alive;
Console.WriteLine(currentPlayerStatus);
}
}
}
3. 在结构体中声明(不常用)
namespace MyApplication
{
public struct GameCharacter
{
// 在结构体中声明枚举
public enum CharacterType
{
Warrior,
Mage,
Archer
}
public CharacterType Type { get; set; }
}
public class Program
{
public static void Main()
{
GameCharacter.CharacterType characterType = GameCharacter.CharacterType.Warrior;
Console.WriteLine(characterType);
}
}
}
二、 实际场景应用
(1) Unity 中的枚举声明与使用
// 声明枚举类型(在脚本顶部)
public enum WeaponType { Sword, Bow, Staff }
public class Player : MonoBehaviour
{
// 声明枚举变量(作为字段)
[SerializeField]
private WeaponType _currentWeapon = WeaponType.Sword;
void Start()
{
// 声明枚举变量(在方法内)
WeaponType droppedWeapon = WeaponType.Bow;
}
}
(2) 配置选项场景
// 声明枚举类型
public enum Difficulty { Easy, Normal, Hard }
public class GameSettings
{
// 声明枚举变量(属性)
public Difficulty CurrentDifficulty { get; set; } = Difficulty.Normal;
}
(3)与switch一起使用
public enum PlayerState
{
Idle,
Running,
Jumping,
Attacking,
Dead
}
private PlayerState _currentState;
void Update()
{
switch (_currentState)
{
case PlayerState.Idle:
HandleIdle();
break;
case PlayerState.Running:
HandleRunning();
break;
case PlayerState.Jumping:
// 跳跃时禁止其他操作
if (IsGrounded()) _currentState = PlayerState.Idle;
break;
case PlayerState.Dead:
ShowGameOverUI();
enabled = false; // 禁用脚本
break;
default:
Debug.LogError("未知状态: " + _currentState);
break;
}
}
三、枚举类型转换
一)枚举与整数转换
1. 枚举 → 整数
-
显式转换:直接强制转换,获取枚举成员的底层整数值。
public enum Day { Monday = 1, Tuesday, Wednesday }
Day today = Day.Tuesday;
int dayNumber = (int)today; // 2
2. 整数 → 枚举
-
强制转换:直接将整数转为枚举类型,但需确保值有效。
int input = 3;
Day day = (Day)input; // Wednesday
//验证有效性
if (Enum.IsDefined(typeof(Day), input)) {
Day validDay = (Day)input;
} else {
Debug.Log("无效的日期值");
}
二)枚举与字符串转换
1. 枚举 → 字符串
-
ToString():直接转换为成员名称。
Day today = Day.Monday;
string text = today.ToString(); // "Monday"
2. 字符串 → 枚举
-
Enum.Parse:解析字符串为枚举值(严格区分大小写)。
string input = "Wednesday";
Day day = (Day)Enum.Parse(typeof(Day), input); // Day.Wednesday
四、常见错误
// ❌ 错误:试图在方法内声明枚举类型
void SomeMethod()
{
enum Direction { Up, Down } // C#不允许在方法内定义枚举
}
// ✅ 正确:在类或命名空间内声明枚举
public class MyClass
{
public enum Direction { Up, Down }
}
五、练习
1、定义一个QQ状态的枚举,并提示用户选择一个在线状态,接受输入的数字,并将其转换成枚举类型
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
/// <summary>
/// QQ状态
/// </summary>
enum E_QQType
{
OnLine,
Leave,
Busy,
Invisible
}
internal class Program
{
static void Main(string[] args)
{
//定义一个QQ状态的枚举,并提示用户选择一个在线状态,接受输入的数字,并将其转换成枚举类型
try
{
Console.WriteLine("请输入一个数字QQ状态(0在线,1离开,2忙碌,3隐身)");
int type = int.Parse(Console.ReadLine());
E_QQType qqType = (E_QQType)type;
Console.WriteLine(qqType);
//Console.WriteLine(qqType.ToString());
//当直接输出一个枚举值时,编译器会自动调用其 ToString() 方法。因此,这两段代码的输出结果是相同的,唯一的区别在于是否显式调用了 ToString() 方法
}
catch
{
Console.WriteLine("请输入有效数字");
}
}
}
}
2、用户去星巴克买咖啡,分为中杯(35元),大杯(40元),超大杯(43元),
请用户选择要购买的类型,用户选择后打印:您购买了XX咖啡,花费了XX元。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
/// <summary>
/// 咖啡大小
/// </summary>
enum E_CoffeeType
{
Middle,
Big,
Super
}
internal class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("请输入咖啡大小类型(中杯0,大杯1,超大杯2)");
int type = int.Parse(Console.ReadLine());
E_CoffeeType cType = (E_CoffeeType)type;
switch(cType)
{
case E_CoffeeType.Middle:
Console.WriteLine("你购买了中杯咖啡,花费了35元");
break;
case E_CoffeeType.Big:
Console.WriteLine("你购买了大杯咖啡,花费了40元");
break;
case E_CoffeeType.Super:
Console.WriteLine("你购买了超大杯咖啡,花费了43元");
break;
default:
Console.WriteLine("请输入正确类型");
break;
}
Console.WriteLine(cType);
}
catch
{
Console.WriteLine("请输入有效数字");
}
}
}
}
3、请用户选择英雄性别与英雄职业,最后打印英雄的基本属性(攻击力,防御力,技能)
//请用户选择英雄性别与英雄职业,最后打印英雄的基本属性(攻击力,防御力,技能)
//性别:
//男(攻击力 + 50,防御力 + 100)
//女(攻击力 + 150,防御力 + 20)
//职业:
//战士(攻击力 + 20,防御力 + 100,技能:冲锋)
//猎人(攻击力 + 120,防御力 + 10,技能:假死)
//法师(攻击力 + 200,防御力 + 10,技能:奥术冲击)
//举例打印:你选择了“女性法师”,攻击力:350,防御力:30,职业技能:奥术冲击
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
/// <summary>
/// 性别
/// </summary>
enum E_Sex
{
Man,
Woman
}
/// <summary>
/// 职业
/// </summary>
enum E_Occupation
{
Warrior, //战士
Hunter, //猎人
Master //法师
}
internal class Program
{
static void Main(string[] args)
{
//请用户选择英雄性别与英雄职业,最后打印英雄的基本属性(攻击力,防御力,技能)
//性别:
//男(攻击力 + 50,防御力 + 100)
//女(攻击力 + 150,防御力 + 20)
//职业:
//战士(攻击力 + 20,防御力 + 100,技能:冲锋)
//猎人(攻击力 + 120,防御力 + 10,技能:假死)
//法师(攻击力 + 200,防御力 + 10,技能:奥术冲击)
//举例打印:你选择了“女性法师”,攻击力:350,防御力:30,职业技能:奥术冲击
try
{
Console.WriteLine("请选择性别(0男,1女)");
E_Sex sex = (E_Sex)int.Parse(Console.ReadLine());
string sexStr = "";
int atk = 0; //攻击力
int def = 0; //防御力
switch (sex)
{
case E_Sex.Man:
sexStr = "男性";
atk += 50;
def += 100;
break;
case E_Sex.Woman:
sexStr = "女性";
atk += 150;
def += 20;
break;
default:
break;
}
Console.WriteLine("请选择职业(战士0,猎人1,法师2)");
E_Occupation occ = (E_Occupation)int.Parse(Console.ReadLine());
string skill = ""; //技能
string occupation = ""; //职业
switch (occ)
{
case E_Occupation.Warrior:
atk += 20;
def += 100;
skill = "冲锋";
occupation = "战士";
break;
case E_Occupation.Hunter:
atk += 120;
def += 30;
skill = "假死";
occupation = "猎人";
break;
case E_Occupation.Master:
atk += 200;
def += 10;
skill = "奥术冲击";
occupation = "法师";
break;
default:
break;
}
//打印
Console.WriteLine("你选择了\"{0}{1}\",攻击力:{2},防御力{3},职业技能{4} ", sexStr, occupation, atk, def, skill);
}
catch
{
Console.WriteLine("请输入有效数字");
}
}
}
}
更多推荐

所有评论(0)