C#基础学习(一)复杂数据类型之枚举

news/2025/3/29 22:59:18/

一、复杂数据类型概述

1.1 为什么需要复杂类型?

当处理包含多个关联值的复合数据时,基础数据类型(int、string等)会面临以下问题:

  • 可读性差if(status == 2)中的数字难以理解
  • 维护困难:多个地方使用相同含义的魔法数字
  • 类型不安全:无法在编译时检查有效性

1.2 常见复杂类型

类型特点适用场景
类(Class)引用类型,支持继承业务实体建模
结构体(Struct)值类型,轻量级小型数据结构
枚举(Enum)命名常量集合状态/类型标识
数组(Array)固定大小的集合批量数据处理

那么是什么是枚举呢:

//枚举是一个比较特别的存在//它是一个被命名的整形常量的集合//一般用它来表示 状态 类型等//申明枚举 和 申明枚举变量 是两个概念//申明枚举 :    相当于是 创建一个自定义的枚举类型//申明枚举变量 :使用申明的自定义枚举类型 创建一个枚举变量

 

二、枚举的核心价值

2.1 解决实际问题

优化前代码

if (order.Status == 3) // 3代表已发货
{// 处理发货逻辑
}

 优化后代码

enum E_OrderStatus 
{Pending,//待定Processing,//加工Shipped //运输
}if (order.Status == OrderStatus.Shipped)
{// 逻辑清晰可见
}

2.2 核心优势

  • 代码自文档化
  • 编译时类型检查
  • 避免无效值输入
  • 提升代码可维护性

三、枚举的声明与定义

3.1 基本语法

enum 枚举名称
{枚举项1,       // 默认从0开始枚举项2,       // 自动递增为1枚举项3 = 5,   // 显式赋值枚举项4        // 自动递增为6
}

3.2 声明位置规则

  1. 命名空间级别(推荐)​
namespace MyApplication
{enum Weekday { Mon, Tue, Wed }
}

2、​类/结构体内部

class Player
{enum State { Idle, Moving }
}

 3、禁止在方法内部声明

void Process()
{// enum Error { } // 编译错误!
}

3.3 命名规范建议

  • 使用名词组合(ColorType优于ColorEnum)
  • 避免使用复数形式(Color代替Colors)
  • 首字母大写(符合Pascal命名法)
  • 最好在你的枚举类型前面加上E_,这样别人一下就能知道这是枚举类型的变量

 四、枚举的基本使用

4.1 声明与赋值

    enum GameState {MainMenu,Playing,Paused}class Game{GameState currentState = GameState.MainMenu;}

4.2 逻辑判断

// if判断
if (currentState == GameState.Playing)
{// 处理游戏逻辑
}// switch判断(最佳实践)
switch (currentState)
{case GameState.MainMenu:ShowMenu();break;case GameState.Playing:UpdateGame();break;case GameState.Paused:ShowPauseMenu();break;
}

 五、类型转换详解

    enum GameState {MainMenu,Playing,Paused}

5.1 枚举与整型互转

// 枚举转int
GameState state = GameState.Playing;
int stateCode = (int)state; // 结果为1// int转枚举(注意有效性检查)
int input = 2;
if (Enum.IsDefined(typeof(GameState), input))
{GameState newState = (GameState)input;
}

5.2 枚举与字符串互转

// 枚举转字符串
string stateName = GameState.Playing.ToString(); // "Playing"// 字符串转枚举(严格区分大小写)
string input = "Paused";
if (Enum.TryParse(input, out GameState result))
{currentState = result;
}
else
{Console.WriteLine("无效状态!");
}
转换方向代码示例注意事项
枚举 → 整型int code = (int)E_GameState.Playing;直接显式转换
整型 → 枚举E_GameState state = (E_GameState)2;需验证值有效性
枚举 → 字符串string str = E_GameState.Paused.ToString()返回枚举项名称
字符串 → 枚举Enum.Parse(typeof(E_GameState), "GameOver")严格区分大小写,建议TryParse

 六、枚举的高级用法

1、多状态组合(位标志)

        在C#中,[Flags]是用于枚举的特殊特性(Attribute),它开启了枚举的位运算模式,让枚举值可以像开关位一样进行组合操作。后面我们在学习反射的时候会仔细讲述。

[Flags]
enum Permission
{None = 0,         // 0000Read = 1 << 0,    // 0001Write = 1 << 1,   // 0010Execute = 1 << 2, // 0100All = Read | Write | Execute // 0111
}// 用户权限设置
var userPermission = Permission.Read | Permission.Write;// 权限验证
if (userPermission.HasFlag(Permission.Write))
{Console.WriteLine("可执行写入操作");
}

参考使用:用户权限系统,文件属性设置。

2、配置选项管理

enum DisplayOptions
{
ShowHeader = 1    // 二进制 0001
ShowFooter = 2    // 二进制 0010 (1 << 1)
DarkMode = 4      // 二进制 0100 (1 << 2)
}// 组合配置项
var currentOptions = DisplayOptions.ShowHeader | DisplayOptions.DarkMode;// 配置检查
if ((currentOptions & DisplayOptions.DarkMode) != 0)
{ApplyDarkTheme();
}

这个示例确实基于位标志的原理,即使没有显式使用[Flags]特性,只要正确设置枚举值,仍然可以进行位运算操作。但是必须得保障每一个元素都是2的幂

3、游戏状态机

enum PlayerState
{Idle,Walking,Attacking,Dead
}class Player
{private PlayerState _state;public void TakeDamage(){if (_state != PlayerState.Dead){_state = PlayerState.Dead;PlayDeathAnimation();}}
}

4、API参数约束 

enum SortOrder
{Ascending,Descending
}// Web API 接口
[HttpGet("products")]
public IActionResult GetProducts(SortOrder order = SortOrder.Ascending)
{var query = order == SortOrder.Ascending ? _db.Products.OrderBy(p => p.Price): _db.Products.OrderByDescending(p => p.Price);return Ok(query.ToList());
}

5、UI控件状态管理

enum ButtonState
{Normal,Hover,Pressed,Disabled
}void UpdateButtonAppearance(ButtonState state)
{switch (state){case ButtonState.Hover:button.BackColor = Color.LightBlue;break;case ButtonState.Pressed:button.BackColor = Color.Blue;break;case ButtonState.Disabled:button.Enabled = false;break;default:button.ResetVisuals();break;}
}

总结:枚举类型主要是帮助我们分辨变量的含义。而非魔法数值,让人捉摸不透。OK,下一篇预告C#中的数组 


    http://www.ppmy.cn/news/1583337.html

    相关文章

    宝塔面板安装docker flarum失败,请先安装依赖应用: [‘mysql‘]:5/8

    安装失败的解决方案 提示错误请先安装依赖应用: [mysql]:5/8 解决方案&#xff1a;不要使用最新的docker mysql&#xff0c;使用5.7.44版本docker mysql&#xff0c;等安装完毕再安装docker flarum就不会报错了。 如果安装完成你不知道默认的账号密码可以看这里 宝塔docker f…

    vue创建子组件步骤及注意事项

    在 Vue 中创建子组件需要遵循组件化开发的核心原则&#xff0c;并注意数据流、通信机制、复用性等关键点。以下是详细步骤和注意事项&#xff0c;结合代码示例说明&#xff1a; 一、创建子组件的步骤 1. 定义子组件 创建一个 .vue 文件&#xff08;单文件组件&#xff09;&am…

    如何使用AIOps明确Devps的问题归责

    引言 拿出一个确凿的证据往往是解决背锅问题的重要办法。只有这样&#xff0c;才能够在没有互相指责、逃避责任或为自己及团队开脱等不良闹剧的情况下达成共识。DevOps 团队可以借助 AIOps 数据支持的可信度&#xff0c;让问题更清晰、背景更明确&#xff0c;从而一致做出更好…

    【负载均衡系列】nginx返回502错误怎么解决

    当Nginx返回502 Bad Gateway错误时,通常表示Nginx作为反向代理无法从上游服务器(如应用服务器、PHP-FPM、Node.js、Tomcat等)获取有效响应。以下是系统的排查和解决步骤: 1. 确认上游服务状态 ​检查服务是否运行: # 查看应用服务器进程(以PHP-FPM为例) systemctl statu…

    Flink实战教程从入门到精通(基础篇)(四)Flink部署-Standalone运行模式

    目录 一、部署模式 1、会话模式&#xff08;Session Mode&#xff09; 2、单作业模式&#xff08;Per-Job Mode&#xff09; 3、应用模式&#xff08;Application Mode&#xff09; 二、Standalone运行模式&#xff08;了解&#xff09; 1、会话模式部署 2、单作业模式部…

    智慧港口新未来:大数据赋能应急消防,筑牢安全防线

    ​​一、行业趋势和挑战 随着港口建设快速发展&#xff0c;应急消防安全形势日益严峻&#xff0c;传统与非传统风险交织&#xff0c;火灾防控压力持续加大。企业对应急管理创新提出更高要求&#xff0c;借助科技提升服务质量成为关键挑战。根据国务院安全生产委员会办公室、应急…

    Rust+WebAssembly:开启浏览器3D渲染新时代

    引言 在当今的 Web 开发领域&#xff0c;随着用户对网页交互体验的要求日益提高&#xff0c;3D 渲染技术在 Web 应用中的应用愈发广泛。从沉浸式的 Web 游戏&#xff0c;到逼真的虚拟展示场景&#xff0c;3D 渲染引擎承担着将虚拟 3D 世界呈现到用户浏览器中的关键任务。其性能…

    田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)

    田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求&#xff1a; 传统幼苗检测依赖人工&#xff0c;效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战&#xff1a;…