一、枚举的基本概念

在 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("请输入有效数字");
            }
        }
    }
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐