C# 上位机--枚举
一、引言
在 C# 上位机开发过程中,枚举(Enum)是一种非常实用的数据类型,它可以将一组相关的常量组织在一起,使代码更加清晰、易读和易于维护。
二、枚举的基本概念
枚举(Enum)是一种值类型,它定义了一组命名的常量。每个枚举成员都有一个关联的整数值,默认情况下,第一个成员的值为 0,后续成员的值依次递增 1。枚举其实是一组整数类型的组合,它表示一个变量可以选择的值域。使用枚举的好处:一是可以使用符号代替实际的值,使代码看起来更容易理解,二是可以限定值范围,如果使用了枚举类型中没有的值编译器会报错。
例如,我们可以定义一个表示星期的枚举类型:
public enum Weekday
{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
在这个例子中,Monday
的值为 0,Tuesday
的值为 1,以此类推。
三、枚举在 C# 上位机开发中的应用场景
3.1 设备状态标识
在与硬件设备通信时,设备可能会有多种状态,如连接状态、运行状态、故障状态等。我们可以使用枚举来表示这些状态,使代码更加清晰易懂。
3.2 通信协议命令
上位机与下位机之间的通信通常遵循一定的协议,协议中会定义各种命令。使用枚举可以方便地表示这些命令,避免使用魔法数字(Magic Number)。
3.3 数据类型标识
在处理不同类型的数据时,枚举可以用来标识数据的类型,便于进行数据处理和解析。
四、枚举类型的高级用法
4.1 为枚举成员指定特定值
默认情况下,枚举成员的值从 0 开始依次递增。但在某些情况下,我们可能需要为枚举成员指定特定的值,例如与硬件设备通信时,每个命令可能有固定的编号。
public enum HardwareCommand
{Initialize = 100,ReadSensorData = 101,WriteConfiguration = 102,Shutdown = 103
}
在这个例子中,Initialize
的值为 100,ReadSensorData
的值为 101,以此类推。这样,我们在与硬件设备通信时就可以直接使用这些特定的值。
4.2 位标志枚举(Flags 特性)
当一个枚举类型的成员可以组合使用时,我们可以使用 [Flags]
特性将其标记为位标志枚举。位标志枚举允许我们使用按位运算符(如 |
、&
)来组合和检查枚举值。
例如,我们定义一个表示设备权限的枚举:
[Flags]
public enum DevicePermissions
{None = 0,Read = 1,Write = 2,Execute = 4,ReadWrite = Read | Write,All = Read | Write | Execute
}
在这个例子中,每个枚举成员的值都是 2 的幂次方,这样可以确保每个成员的二进制表示中只有一位是 1。我们可以使用按位或运算符 |
来组合多个权限:
DevicePermissions userPermissions = DevicePermissions.Read | DevicePermissions.Write;
使用按位与运算符 &
来检查是否具有某个权限:
if ((userPermissions & DevicePermissions.Write) == DevicePermissions.Write)
{Console.WriteLine("用户具有写入权限");
}
4.3 枚举与字符串的相互转换
在实际开发中,我们经常需要将枚举值转换为字符串,或者将字符串转换为枚举值。C# 提供了一些方法来实现这些转换。
枚举值转换为字符串
Weekday today = Weekday.Monday;
string dayName = today.ToString();
Console.WriteLine(dayName); // 输出: Monday
字符串转换为枚举值
string dayString = "Tuesday";
Weekday day;
if (Enum.TryParse(dayString, out day))
{Console.WriteLine($"转换成功,对应的枚举值为: {day}");
}
else
{Console.WriteLine("转换失败");
}
4.4 遍历枚举成员
我们可以使用 Enum.GetValues
方法来获取枚举类型的所有成员,并进行遍历。
foreach (Weekday day in Enum.GetValues(typeof(Weekday)))
{Console.WriteLine(day);
}
五、程序演示
下面我们通过一个简单的 C# 上位机程序示例来演示枚举的使用,包括上述的高级用法。假设我们有一个模拟的设备,需要控制它的状态并读取其数据,同时管理用户对设备的权限。
5.1 定义枚举类型
// 设备状态枚举
public enum DeviceStatus
{Disconnected,Connecting,Connected,Running,Stopped,Fault
}
// 通信命令枚举
public enum CommunicationCommand
{ReadData = 1,WriteData = 2,StartDevice = 3,StopDevice = 4,ResetDevice = 5
}
// 设备权限枚举,使用 Flags 特性
[Flags]
public enum DevicePermissions
{None = 0,Read = 1,Write = 2,Start = 4,Stop = 8,Reset = 16,All = Read | Write | Start | Stop | Reset
}
5.2 模拟设备类
public class SimulatedDevice
{public DeviceStatus Status { get; private set; } = DeviceStatus.Disconnected;public DevicePermissions UserPermissions { get; set; } = DevicePermissions.None;public void SendCommand(CommunicationCommand command){switch (command){case CommunicationCommand.StartDevice:if ((UserPermissions & DevicePermissions.Start) == DevicePermissions.Start){if (Status == DeviceStatus.Connected){Status = DeviceStatus.Running;Console.WriteLine("设备已启动");}else{Console.WriteLine("设备未连接,无法启动");}}else{Console.WriteLine("用户没有启动设备的权限");}break;case CommunicationCommand.StopDevice:if ((UserPermissions & DevicePermissions.Stop) == DevicePermissions.Stop){if (Status == DeviceStatus.Running){Status = DeviceStatus.Stopped;Console.WriteLine("设备已停止");}else{Console.WriteLine("设备未运行,无法停止");}}else{Console.WriteLine("用户没有停止设备的权限");}break;case CommunicationCommand.ResetDevice:if ((UserPermissions & DevicePermissions.Reset) == DevicePermissions.Reset){Status = DeviceStatus.Disconnected;Console.WriteLine("设备已重置");}else{Console.WriteLine("用户没有重置设备的权限");}break;case CommunicationCommand.ReadData:if ((UserPermissions & DevicePermissions.Read) == DevicePermissions.Read){if (Status == DeviceStatus.Running){Console.WriteLine("读取设备数据...");}else{Console.WriteLine("设备未运行,无法读取数据");}}else{Console.WriteLine("用户没有读取设备数据的权限");}break;case CommunicationCommand.WriteData:if ((UserPermissions & DevicePermissions.Write) == DevicePermissions.Write){Console.WriteLine("写入数据到设备(暂未实现)");}else{Console.WriteLine("用户没有写入设备数据的权限");}break;default:break;}}
}
5.3 主程序测试
class Program
{static void Main(){SimulatedDevice device = new SimulatedDevice();// 为用户分配权限device.UserPermissions = DevicePermissions.Read | DevicePermissions.Start;// 尝试启动设备device.SendCommand(CommunicationCommand.StartDevice);// 尝试读取数据device.SendCommand(CommunicationCommand.ReadData);// 尝试写入数据(用户没有该权限)device.SendCommand(CommunicationCommand.WriteData);// 尝试停止设备(用户没有该权限)device.SendCommand(CommunicationCommand.StopDevice);// 尝试重置设备(用户没有该权限)device.SendCommand(CommunicationCommand.ResetDevice);}
}
六、总结
通过本文的介绍和示例,我们了解了枚举(Enum)在 C# 上位机开发中的基本概念、常见应用场景以及高级用法。合理使用枚举可以使代码更加清晰、易读,减少错误的发生。在实际的上位机开发中,我们可以根据具体的需求灵活运用枚举来提高代码的质量和可维护性。希望本文对大家有所帮助,如果你有任何疑问或建议,欢迎留言交流,留言必回关!
相关文章:

C# 上位机--枚举
一、引言 在 C# 上位机开发过程中,枚举(Enum)是一种非常实用的数据类型,它可以将一组相关的常量组织在一起,使代码更加清晰、易读和易于维护。 二、枚举的基本概念 枚举(Enum)是一种值类型&a…...

01docker run
docker run 用于从镜像创建并启动容器。下面是一些常用的选项: -d: 让容器在后台运行,即以守护进程模式运行。--name: 给容器指定一个名称,便于识别和管理。-p: 将宿主机的端口映射到容器内的端口,实现网络通信。-e: 设置环境变量…...

易语言.飞扬特性展示2
类型反射:编译后的类型具有“自省”性。可以在运行时获取类型(或类库)的定义信息。可以根据类名称动态创建类对象,并调用对象指定方法。提供“反射”类库供程序员使用。静态编译: 源代码将被直接编译为可执行代码。 没…...

FlashDecoding
Flash Attention是将Q划分到所有SM block上。每个SM block上的Q,负责和所有K和所有V进行计算,得到对应的结果。期间,SM block彼此之间,不需要通信。 在prefill阶段,seqLength*batchSize*Heads足够多,所以每…...

提示词生成新方法,用Make自动化生成
提示词生成新方法!用Make自动化生成! 在当今快速发展的科技时代,人工智能(AI)正在改变我们如何创作内容。然而,待人青睐的诀窍——提示词生成,可能令许多创作者感到迷惘。你是否曾在写作中挣扎…...

每日一题——括号生成
题解 给定 n 对括号,要求编写一个函数生成所有合法的括号组合。合法的括号组合必须满足每一对括号中的左括号必须先于右括号,并且括号数量必须平衡。 题目描述 输入: 一个整数 n,表示括号的对数,满足 0 ≤ n ≤ 1…...

实操部署DeepSeek,添加私有知识库
目录 一、环境介绍 PowerShell版本: wsl版本: 虚拟机版本: 本机IP: 虚拟机IP: 容器宿主机IP(host.docker.internal): Docker版本: Docker Compose版本ÿ…...

宜宾数字经济新标杆:树莓集团赋能区域产业转型升级
树莓集团在宜宾成为数字经济新标杆,有力地赋能区域产业转型升级。在传统产业数字化转型方面,树莓集团针对宜宾的制造业企业,引入工业互联网技术。 通过搭建工业互联网平台,实现企业生产设备的联网和数据采集,帮助企业…...

8.大规模推荐系统的实现
接下来我们将学习大规模推荐系统的实现。在实际应用中,推荐系统需要处理海量数据,并在短时间内生成推荐结果。这要求我们在设计和实现推荐系统时,考虑到数据的分布式存储与处理、计算的高效性和系统的可扩展性。在这一课中,我们将…...

第三届通信网络与机器学习国际学术会议(CNML 2025)
在线投稿: 学术会议-学术交流征稿-学术会议在线-艾思科蓝 通信网络机器学习 通信理论 通信工程 计算机网络和数据通信 信息分析和基础设施 通信建模理论与实践 无线传感器和通信网络 云计算与物联网 网络和数据安全 光电子学和光通信 无线/移动通信和技术 智能通信…...

MySQL两阶段提交策略
书接上一篇文章,MySQL通过不同的策略来保证事务的ACID:原子性、一致性、隔离性、持久性,通过锁机制实现隔离性,通过redoundobinlog三种日志实现事务的原子性、一致性和持久性。 本文主要讲MySQL的持久性的一个实现机制-两阶段提交…...

uniapp商城之购物车模块
文章目录 一、列表渲染二、删除单品1.封装删除API2.按钮绑定事件三、修改单品数量1.复用步进器组件2.属性和事件的绑定3.接口封装4.调用接口四、修改商品选中/全选1.单品选中绑定事件调用修改API2.计算全选状态3.绑定事件调用全选API并渲染单品选中状态五、底部结算信息1.计算选…...

STM32_USART通用同步/异步收发器
目录 背景 程序 STM32浮空输入的概念 1.基本概念 2. STM32浮空输入的特点 3. STM32浮空输入的应用场景 STM32推挽输出详解 1. 基本概念 2. 工作原理 3. 应用场景 使能外设时钟 TXE 和 TC的区别 USART_IT_TXE USART_IT_TC 使能串口外设 中断处理函数 背景 单片…...

python自动化测试之Pytest框架之YAML详解以及Parametrize数据驱动!
一、YAML详解 YAML是一种数据类型,它能够和JSON数据相互转化,它本身也是有很多数据类型可以满足我们接口 的参数类型,扩展名可以是.yml或.yaml 作用: 1.全局配置文件 基础路径,数据库信息,账号信息&…...

python基础入门:6.3异常处理机制
Python异常处理全面指南:构建健壮程序的关键技术 # 完整异常处理模板 def process_file(file_path):"""文件处理示例函数"""file Nonetry:file open(file_path, r, encodingutf-8)data json.load(file)if not data:raise EmptyDa…...

Mybatis快速入门与核心知识总结
Mybatis 1. 实体类(Entity Class)1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件(可选)3.1 …...

畅聊deepseek-r1,SiliconFlow 硅基流动注册+使用
文章目录 SiliconFlow 硅基流动注册使用注册创建API密钥使用网页端使用代码调用api调用支持的模型 SiliconFlow 硅基流动注册使用 注册 硅基流动官网 https://cloud.siliconflow.cn/i/XcgtUixn 注册流程 切换中文 邀请码: XcgtUixn 创建API密钥 账户管理 --&g…...

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示
一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码示例,使用Arduino语言: 硬件连接 INMP441 VCC → ESP32的3.3VINMP441 GND → ESP32的GNDINMP441 SCK → ESP32的GPIO 17INMP441 WS → ESP32的GPIO 18INMP441 SD → ESP32的GPIO 16RG…...

Springboot 中如何使用Sentinel
在 Spring Boot 中使用 Sentinel 非常方便,Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件,可以快速将 Sentinel 集成到你的 Spring Boot 应用中,并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …...

访问Elasticsearch服务 curl ip 端口可以 浏览器不可以
LINUX学习 在虚拟机上面的linux上面用docker 部署Elasticsearch项目后,在linux系统内部用curl ip 端口地址的形式可以访问到Elasticsearch。可以返回数据。 但是在本机的浏览器中输入ip 端口,会报错,找不到服务。 ping 和 trelnet均不通。 …...

Curser2_解除机器码限制
# Curser1_无限白嫖试用次数 文末有所需工具下载地址 Cursor Device ID Changer 一个用于修改 Cursor 编辑器设备 ID 的跨平台工具集。当遇到设备 ID 锁定问题时,可用于重置设备标识。 功能特性 ✨ 支持 Windows 和 macOS 系统🔄 自动生成符合格式的…...

人工智能与低代码如何重新定义企业数字化转型?
引言:数字化转型的挑战与机遇 在全球化和信息化的浪潮中,数字化转型已经成为企业保持竞争力和创新能力的必经之路。然而,尽管“数字化”听上去是一个充满未来感的词汇,落地的过程却往往充满困难。 首先,传统开发方式…...

arkTS基础
arkTS基础 // 变量声明 let hi: string hello; hi hello,world; // 常量声明 const hi: string hello;// ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定 // 如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。…...

C++20中的std::atomic_ref
一、std::atomic_ref 我们在学习C11后的原子操作时,都需要提前定义好std::atomic变量,然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显,所以这也使得很多开发者越来习惯使用原子变量。 但是,在实…...

四、自然语言处理_08Transformer翻译任务案例
0、前言 在Seq2Seq模型的学习过程中,做过一个文本翻译任务案例,多轮训练后,效果还算能看 Transformer作为NLP领域的扛把子,对于此类任务的处理会更为强大,下面将以基于Transformer模型来重新处理此任务,看…...

spring学习(使用spring加载properties文件信息)(spring自定义标签引入)
目录 一、博客引言。 二、基本配置准备。 (1)初步分析。 (2)初始spring配置文件。 三、spring自定义标签的引入。 (1)基本了解。 (2)引入新的命名空间:xmlns:context。 &…...

bigemap pro如何进行poi兴趣点搜索?
准备工具:BIGEMAP Pro是数据要素设计软件(DED),国产基础软件,大数据编辑、制图、多源数据要素类处理软件打开软件右上角选择分类搜索然后用矩形或者选择行政边界线选择需要查询的范围选中范围以后点击查询然后可以直接加载到地图然后图层右键数据导出矢量…...

Mybatis源码02 - 初始化基本过程(引导层部分)
初始化基本过程(引导层部分) 文章目录 初始化基本过程(引导层部分)一:初始化的方式及引入二:初始化方式-XML配置文件1:MyBatis初始化基本过程2:创建Configuration对象的过程2.1&…...

【Elasticsearch】bucket_sort
Elasticsearch 的bucket_sort聚合是一种管道聚合,用于对父多桶聚合(如terms、date_histogram、histogram等)的桶进行排序。以下是关于bucket_sort的详细说明: 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序ÿ…...

k8s证书过期怎么更新?
在 Kubernetes 集群中,证书过期可能导致集群不可用,尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行,您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤: 1. 检查证书状…...