C# 枚举(Enum)详解

枚举(Enumeration,简称 Enum )是 C# 中一种值类型,用于表示一组固定的、具有明确含义的常量集合。

简单来说:

枚举 = 给一组整数值起有意义的名字

例如:

不用枚举:

复制代码
int status = 1;

if (status == 1)
{
    Console.WriteLine("运行中");
}

问题:

  • 1 代表什么?别人不知道
  • 代码可读性差
  • 容易写错

使用枚举:

cs 复制代码
Status status = Status.Running;

if (status == Status.Running)
{
    Console.WriteLine("运行中");
}

代码更加清晰。


一、枚举的基本语法

1. 定义枚举

语法:

复制代码
enum 枚举名
{
    成员1,
    成员2,
    成员3
}

示例:

cs 复制代码
enum WeekDay
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

使用:

cs 复制代码
WeekDay today = WeekDay.Monday;

Console.WriteLine(today);

输出:

复制代码
Monday

二、枚举底层原理

枚举本质上是整数类型。

例如:

cs 复制代码
enum Color
{
    Red,
    Green,
    Blue
}

编译后类似:

复制代码
Red = 0
Green = 1
Blue = 2

默认从 0 开始递增

等价于:

复制代码
Console.WriteLine((int)Color.Red);

输出:

复制代码
0

三、指定枚举值

可以手动指定值:

cs 复制代码
enum ErrorCode
{
    Success = 200,
    NotFound = 404,
    ServerError = 500
}

使用:

复制代码
int code = (int)ErrorCode.NotFound;

Console.WriteLine(code);

输出:

复制代码
404

四、枚举值可以重复

例如:

cs 复制代码
enum Status
{
    OK = 1,
    Success = 1,
    Failed = 2
}

这里:

复制代码
Status.OK

和:

复制代码
Status.Success

实际上都是:

复制代码
1

允许存在。


五、枚举的类型转换

1. 枚举转整数

显式转换:

cs 复制代码
enum Level
{
    Low = 1,
    Medium = 2,
    High = 3
}


Level level = Level.High;

int value = (int)level;

Console.WriteLine(value);

输出:

复制代码
3

2. 整数转枚举

cs 复制代码
int value = 2;

Level level = (Level)value;

Console.WriteLine(level);

输出:

复制代码
Medium

注意:

如果数字不存在:

cs 复制代码
Level level = (Level)100;

Console.WriteLine(level);

输出:

复制代码
100

不会报错。

所以转换前最好检查:

cs 复制代码
if(Enum.IsDefined(typeof(Level),100))
{
    Level level=(Level)100;
}

六、枚举与字符串转换

1. 枚举转字符串

cs 复制代码
Level level = Level.High;

string text = level.ToString();

Console.WriteLine(text);

输出:

复制代码
High

2. 字符串转枚举

cs 复制代码
string text = "Medium";

Level level = Enum.Parse<Level>(text);

Console.WriteLine(level);

输出:

复制代码
Medium

如果字符串可能错误:

cs 复制代码
string text="AAA";

if(Enum.TryParse(text,out Level level))
{
    Console.WriteLine(level);
}
else
{
    Console.WriteLine("无效值");
}

七、枚举遍历

使用:

cs 复制代码
foreach(Level item in Enum.GetValues(typeof(Level)))
{
    Console.WriteLine(item);
}

输出:

复制代码
Low
Medium
High

八、枚举判断

例如:

cs 复制代码
enum UserRole
{
    Guest,
    User,
    Admin
}

判断:

cs 复制代码
UserRole role = UserRole.Admin;

if(role == UserRole.Admin)
{
    Console.WriteLine("管理员");
}

九、Flags 枚举(位枚举)

这是 C# 枚举非常重要的高级用法。

普通枚举:

cs 复制代码
enum Permission
{
    Read,
    Write,
    Delete
}

只能表示一种状态。

例如:

用户同时拥有:

复制代码
读取 + 写入

怎么办?

使用 Flags。


1. 定义 Flags 枚举

cs 复制代码
[Flags]
enum Permission
{
    None = 0,
    Read = 1,
    Write = 2,
    Delete = 4
}

这里使用二进制:

cs 复制代码
Read    0001
Write   0010
Delete  0100

2. 组合权限

cs 复制代码
Permission userPermission =
    Permission.Read |
    Permission.Write;

结果:

复制代码
0011

表示:

复制代码
读取 + 写入

3. 判断权限

cs 复制代码
if((userPermission & Permission.Read)
    == Permission.Read)
{
    Console.WriteLine("有读取权限");
}

4. 添加权限

复制代码
userPermission |= Permission.Delete;

5. 删除权限

复制代码
userPermission &= ~Permission.Write;

十、枚举作为 switch 条件

枚举最常见用途:

cs 复制代码
enum Operation
{
    Add,
    Subtract,
    Multiply
}


Operation op = Operation.Add;


switch(op)
{
    case Operation.Add:
        Console.WriteLine("加法");
        break;

    case Operation.Subtract:
        Console.WriteLine("减法");
        break;

    case Operation.Multiply:
        Console.WriteLine("乘法");
        break;
}

十一、枚举在类中的使用

例如:

cs 复制代码
class Player
{
    public string Name {get;set;}

    public PlayerState State {get;set;}
}


enum PlayerState
{
    Idle,
    Running,
    Dead
}

使用:

复制代码
Player p = new Player();

p.Name="Tom";

p.State=PlayerState.Running;

十二、枚举与数据库设计

常见场景:

用户状态:

复制代码
enum UserStatus
{
    Normal=1,
    Disabled=2,
    Deleted=3
}

数据库:

Id Status
1 1
2 2

代码:

复制代码
UserStatus status =
    (UserStatus)reader["Status"];

优点:

数据库存数字:

复制代码
1
2
3

代码显示:

复制代码
Normal
Disabled
Deleted

十三、枚举常用方法

Enum.GetName()

获取名称:

cs 复制代码
string name =
Enum.GetName(typeof(Level),2);

Console.WriteLine(name);

输出:

复制代码
Medium

Enum.IsDefined()

判断是否存在:

复制代码
bool result =
Enum.IsDefined(typeof(Level),3);

Enum.GetValues()

获取所有值:

复制代码
Array values =
Enum.GetValues(typeof(Level));

Enum.GetNames()

获取所有名称:

复制代码
string[] names =
Enum.GetNames(typeof(Level));

十四、枚举最佳实践

1. 使用复数命名(推荐)

推荐:

复制代码
enum Colors
{

}

或者:

cs 复制代码
enum UserStatus
{

}

不推荐:

复制代码
enum ColorType
{

}

2. 明确指定业务值

不要:

cs 复制代码
enum Status
{
    Normal,
    Disabled
}

因为以后添加成员可能改变编号。

推荐:

cs 复制代码
enum Status
{
    Normal = 1,
    Disabled = 2
}

3. Flags 必须使用 2 的幂

正确:

cs 复制代码
Read=1
Write=2
Delete=4

错误:

cs 复制代码
Read=1
Write=2
Delete=3

因为:

复制代码
3 = 1+2

会产生冲突。


十五、枚举和常量的区别

const enum
用途 单个常量 多个相关常量
类型 任意 整数类型
可读性 一般
组合 不方便 支持Flags

例如:

常量:

复制代码
const int Red=1;
const int Green=2;

枚举:

cs 复制代码
enum Color
{
    Red,
    Green
}

明显枚举更适合。


十六、实际项目案例

订单状态:

cs 复制代码
public enum OrderStatus
{
    Created = 1,
    Paid = 2,
    Shipping = 3,
    Completed = 4,
    Cancelled = 5
}

订单类:

cs 复制代码
public class Order
{
    public int Id {get;set;}

    public OrderStatus Status {get;set;}
}

业务:

cs 复制代码
Order order=new Order();

order.Status=OrderStatus.Paid;


if(order.Status==OrderStatus.Paid)
{
    Console.WriteLine("订单已支付");
}

比:

复制代码
if(status==2)

安全和易读很多。


总结

C# Enum 核心知识:

知识点 说明
enum 定义枚举
默认值 从0开始
底层 整数类型
转换 强制转换
Parse 字符串转枚举
TryParse 安全转换
Flags 多选状态
switch 状态判断
数据库 状态字段最佳选择

一句话总结:

枚举就是把一组有固定含义的数字,包装成可读、可维护、安全的类型,是 C# 中表示状态、权限、分类最常用的数据结构之一。

相关推荐
nianniannnn1 小时前
c++复习自存--标准模板库STL
开发语言·c++·windows
努力努力再努力wz1 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
什巳1 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
lang201509281 小时前
Apache POI Word(docx) 实战教程:从入门到精通表格合并、图片插入与文档合并
java·开发语言·word
树獭叔叔1 小时前
从 Search 到 Extract:AI Agent 网页工具架构拆解
后端·agent·ai编程
梨子同志2 小时前
Nacos
后端
宠友信息2 小时前
Redis 内容社区源码架构优化与即时通讯数据一致性处理
spring boot·后端·websocket·mysql·uni-app
Csvn2 小时前
Python 开发技巧 · 高级装饰器 —— 从基础到工业级实战
后端
码云之上2 小时前
项目团队从 5 人扩到 15 人,我写了个 CLI 让 IDE 共享 AI 规则
前端·人工智能·后端