当前位置: 首页 > news >正文

C#枚举(Enum)详解

在 C# 中,‌枚举(Enum)‌ 是一种值类型,用于定义一组命名的常量值,提高代码的可读性和可维护性。以下是枚举的核心概念、用法和最佳实践:


‌1. 枚举的核心特性‌

  • 类型安全‌:避免使用魔法数字(如 0, 1),用语义化的名称代替。
  • 值类型‌:存储在栈上,默认基础类型为 int,但可显式指定其他整型(如 byte, short)。
  • 不可继承‌:枚举本身不能派生其他类型。
  • ‌组合支持‌:通过 Flags 特性实现位标志(Bit Flags)的按位操作。

‌2. 枚举的声明语法‌

// 默认基础类型为 int
public enum Color
{
    Red,    // 默认值为 0
    Green,  // 值为 1
    Blue    // 值为 2
}
// 显式指定基础类型和值
public enum FileAccess : byte
{
    Read = 1,
    Write = 2,
    ReadWrite = Read | Write
}

‌3. 枚举的常见用法‌
‌(1) 基础用法‌

Color color = Color.Red;
Console.WriteLine(color);            // 输出: Red
Console.WriteLine((int)color);       // 输出: 0

‌(2) 位标志(Flags)‌

[Flags]
public enum Permissions
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4,
    All = Read | Write | Execute
}
// 组合多个权限
Permissions userPermissions = Permissions.Read | Permissions.Write;
Console.WriteLine(userPermissions);  // 输出: Read, Write
// 检查权限
bool canWrite = userPermissions.HasFlag(Permissions.Write); // true

‌(3) 枚举与字符串转换‌

// 枚举转字符串
string colorName = Color.Green.ToString();  // "Green"

// 字符串转枚举
Color parsedColor;
if (Enum.TryParse("Blue", out parsedColor))
{
    Console.WriteLine(parsedColor); // Blue
}

‌(4) 遍历枚举值‌

foreach (Color color in Enum.GetValues(typeof(Color)))
{
    Console.WriteLine(color);
}

‌4. 枚举的底层原理‌

  • 默认值分配‌:第一个枚举值默认为 0,后续值依次递增。
  • 显式赋值‌:可手动指定任意整数值(允许重复,但需谨慎)。
  • ‌内存占用‌:基础类型决定大小(如 byte 占用 1 字节,int 占用 4 字节)。

‌5. 枚举的最佳实践‌

  • 语义化命名‌:用明确的名称(如 OrderStatus.Pending)代替数字。
  • ‌避免重复值‌:重复值可能导致逻辑歧义。
  • 优先使用 Flags‌:需要组合多个选项时,使用 [Flags] 特性。
  • ‌处理无效值‌:用 Enum.IsDefined 检查值是否合法:
t value = 10;
if (Enum.IsDefined(typeof(Color), value))
{
    Color color = (Color)value;
}

‌6. 枚举 vs 常量 vs 类‌

特性枚举(Enum)常量(const)类(Class)
‌类型安全‌❌(仅数值替换)
‌可组合性‌✅(通过 Flags)✅(通过属性或方法)
‌语义明确性‌❌(需注释说明意义)
‌内存占用‌(值类型)无(编译时替换)

‌7. 常见问题‌
如何获取枚举的所有名称和值?‌

foreach (var name in Enum.GetNames(typeof(Color)))
{
    Console.WriteLine(name); // Red, Green, Blue
}

foreach (var value in Enum.GetValues(typeof(Color)))
{
    Console.WriteLine((int)value); // 0, 1, 2
}

如何处理未定义的枚举值?‌

int invalidValue = 99;
if (Enum.IsDefined(typeof(Color), invalidValue))
{
    // 有效值处理
}
else
{
    // 无效值处理(如抛出异常或默认值)
}

如何扩展枚举?‌
枚举不支持继承,但可通过以下方式扩展:

  • 新增枚举值‌(需谨慎,可能破坏现有代码)。
  • 使用 Enum 的扩展方法:
public static class ColorExtensions
{
    public static bool IsPrimary(this Color color)
    {
        return color == Color.Red || color == Color.Green || color == Color.Blue;
    }
}

‌8.常用的应用场景‌

  • 状态码‌:如 HttpStatusCode.OK、OrderStatus.Shipped。
  • 选项配置‌:如 FontStyle.Bold | FontStyle.Italic。
  • ‌类型分类‌:如 LogLevel.Error、DeviceType.Mobile。

通过合理使用枚举,可以显著提升代码的可读性和健壮性。

相关文章:

  • 10✨让笔迹突破语言壁垒!Manus AI 多语言识别开启智能书写新纪元
  • CMD批处理一些冷门命令,编写windows脚本常用?
  • vue3+setup组件封装及传值
  • 第2章、WPF窗体及其属性
  • golang从入门到做牛马:第二十二篇-Go语言并发:多任务的“协同作战”
  • 【视频】V4L2、ffmpeg、OpenCV中对YUV的定义
  • 大模型微调|使用 LLaMA-Factory 微调 Llama3-8B-Chinese-Chat 完成知识问答任务
  • Linux 中的管道:进程间数据传输的利器
  • jmeter接口测试(三)
  • Leetcode 698-划分为k个相等的子集
  • upload-labs通关攻略 【Pass-01~Pass-19】
  • 【JavaEE】Spring Boot配置文件
  • Docker基础入门(一)
  • STM32 单片机常见的 8 种输入输出模式
  • 解决远程主机允许路由转发 【原理扫描】:将/proc/sys/net/ipv4/ip_forward 置为0
  • HarmonyOS学习第20天:让应用“找准方向”的地图与定位秘籍
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-8.1.2近似最近邻(ANN)算法选型
  • 用Python写一个天气预报小程序
  • C++学习——顺序表(四)
  • SpringMVC (一)基础
  • 俄乌直接谈判勉强收场,特朗普再次“电话外交”能否有用?|907编辑部
  • 外交部发言人就第78届世界卫生大会拒绝涉台提案发表谈话
  • 中方是否担忧美国主权信用评级下调?外交部:美国应采取负责任的政策措施
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见
  • 以色列总理:以哈谈判内容包括“结束战争的框架”
  • 俄外长与美国务卿通电话,讨论俄美接触等问题