在C#开发中,枚举是一种特殊的值类型,用于定义一组具有命名常量的集合,能够替代魔法数字,让代码逻辑更清晰,取值更规范。枚举常用于表示固定的状态、类型、选项等场景,比如订单状态、用户角色、颜色类型等。

C#枚举的基础定义语法
定义C#枚举使用enum关键字,基础语法结构如下:
// 基础枚举定义,默认底层类型是int
enum OrderStatus
{
// 第一个成员默认值为0,后续成员依次递增1
Pending, // 待处理,值为0
Processing, // 处理中,值为1
Shipped, // 已发货,值为2
Delivered // 已送达,值为3
}
枚举的默认底层类型是int,也可以显式指定其他整数类型作为底层类型,支持的类型包括byte、sbyte、short、ushort、int、uint、long、ulong。
// 指定底层类型为byte的枚举
enum ColorType : byte
{
Red, // 0
Green, // 1
Blue // 2
}
带自定义初始值的枚举定义
可以手动为枚举成员指定初始值,未指定初始值的成员会在前一个成员值的基础上递增1。
enum ErrorCode
{
Success = 0, // 成功,值为0
ParamError = 1001, // 参数错误,值为1001
AuthError = 1002, // 权限错误,值为1002
ServerError = 2001 // 服务错误,值为2001
}
带Flags特性的枚举定义
如果需要枚举可以同时表示多个值,可以使用Flags特性,此时每个成员的值建议设置为2的幂次,方便进行位运算。
[Flags]
enum Permission
{
None = 0, // 无权限,0
Read = 1, // 读权限,1
Write = 2, // 写权限,2
Delete = 4, // 删除权限,4
All = Read | Write | Delete // 所有权限,7
}
枚举的常见使用示例
枚举变量的声明与赋值
class Program
{
static void Main()
{
// 声明枚举变量并赋值
OrderStatus status = OrderStatus.Processing;
Console.WriteLine(status); // 输出:Processing
// 带Flags特性的枚举赋值
Permission perm = Permission.Read | Permission.Write;
Console.WriteLine(perm); // 输出:Read, Write
}
}
枚举与整数之间的转换
枚举和底层整数类型之间可以进行显式转换:
// 整数转枚举 int statusValue = 2; OrderStatus status = (OrderStatus)statusValue; Console.WriteLine(status); // 输出:Shipped // 枚举转整数 OrderStatus currentStatus = OrderStatus.Delivered; int intValue = (int)currentStatus; Console.WriteLine(intValue); // 输出:3
枚举与字符串之间的转换
// 字符串转枚举
string statusStr = "Pending";
OrderStatus parsedStatus = (OrderStatus)Enum.Parse(typeof(OrderStatus), statusStr);
Console.WriteLine(parsedStatus); // 输出:Pending
// 枚举转字符串
OrderStatus status = OrderStatus.Shipped;
string statusString = status.ToString();
Console.WriteLine(statusString); // 输出:Shipped
// 安全转换,避免转换失败抛出异常
if (Enum.TryParse<OrderStatus>("Processing", out OrderStatus result))
{
Console.WriteLine(result); // 输出:Processing
}
枚举使用的注意事项
- 枚举成员的名称建议使用 Pascal 命名法,语义清晰,避免使用无意义的名称。
- 进行枚举转换时,如果值不在枚举定义的范围内,不会报错但会得到无意义的枚举值,建议转换前先判断值是否有效。
- 使用
Flags特性时,建议显式定义None = 0的成员,方便表示空状态。 - 不要给枚举成员赋值为负数,除非有特殊业务需求,避免位运算时出现逻辑问题。
可以通过以下方法判断某个值是否是枚举的有效成员:
int testValue = 5; bool isValid = Enum.IsDefined(typeof(OrderStatus), testValue); Console.WriteLine(isValid); // 输出:False,5不在OrderStatus的有效值中 string testStr = "Shipped"; bool isStrValid = Enum.IsDefined(typeof(OrderStatus), testStr); Console.WriteLine(isStrValid); // 输出:True,Shipped是有效成员