为了让代码极具可读性、结构清晰,并且彻底摆脱各种复杂的底层字符编码,我们应该引入 C# 现代开发中最推崇的面向对象与表现力原则
📅 2026/7/10 23:24:07
👁️ 阅读次数
📝 编程学习
为了让代码极具可读性、结构清晰,并且彻底摆脱各种复杂的底层字符编码,我们应该引入 C# 现代开发中最推崇的面向对象与表现力原则。
我们可以通过两点优化来大幅提升可阅读性:
- 使用C# 局部函数(Local Functions),让“截取”、“强转大端”等动作读起来就像普通的中文指令。
- 使用C# 元组(Tuple)或类构造器替代生硬的数组索引,让每一路数据在放进“簇(Cluster)”的时候,都有清晰的业务名字(比如:过流保护、通道电压)。
以下是为你量身定制的最易读、最具业务表达力的 C# 完整解析代码:
一、 易读版核心解析实现
usingSystem;usingSystem.Collections.Generic;publicclassOverCurrentBoardParserReadable{/// <summary>/// 对应 LabVIEW 的“过流保护板状态簇”/// 将原本没有名字的数组元素,直接映射为带有明确业务含义的属性,可读性极高。/// </summary>publicclassOverCurrentBoardStatus{publicushort错误状态位1{get;set;}// 模拟 LabVIEW 中被解包出来的 16 个 DBL 通道数据(你可以根据板卡说明书进一步改成具体的“电压/电流”名字)publicList<double>通道数据列表{get;set;}=newList<double>();publicushort错误状态位2{get;set;}}/// <summary>/// 极易阅读的解析方法/// </summary>/// <param name="原始字节数组">上游通信直接收到的 byte[] 缓冲区</param>publicstaticOverCurrentBoardStatus 解析板卡数据(byte[]原始字节数组){// 边界安全检查:如果数据长度不足 36 字节,直接返回空簇,防止程序崩溃if(原始字节数组==null||原始字节数组.Length<36)returnnewOverCurrentBoardStatus();// ------------------------------------------------------------------------// 💡 核心设计:定义高可读性的【局部辅助工具】,让下方的解析逻辑像读小说一样简单// ------------------------------------------------------------------------// 工具A:从指定位置截取 2 个字节,并按大端序(高位在前)强转为 U16 数值ushort强转U16(int开始位置){return(ushort)((原始字节数组[开始位置]<<8)|原始字节数组[开始位置+1]);}// 工具B:截取指定位置的 2 字节强转,并自动转换为 DBL 浮点数且除以 10double强转DBL并除以10(int开始位置){ushort原始数值=强转U16(开始位置);return(double)原始数值/10.0;// 对应 LabVIEW 中的 DBL 转换和 x/10 控件}// ------------------------------------------------------------------------// 🚀 开始执行框图数据流逻辑// ------------------------------------------------------------------------var状态簇=newOverCurrentBoardStatus();// 1. 第一路:截取 0-2 转化为数值状态簇.错误状态位1=强转U16(开始位置:0);// 2. 第二路:截取 2-32(共32字节 = 16个U16数据),转化为数组并计算for(inti=0;i<16;i++){// 每次向后移动 2 个字节int目标偏移量=2+(i*2);double计算后的浮点数=强转DBL并除以10(目标偏移量);// 依次插入到簇内部的列表中状态簇.通道数据列表.Add(计算后的浮点数);}// 3. 第三路:截取 34-2 转化为数值状态簇.错误状态位2=强转U16(开始位置:34);// 4. 完美输出最终的“板卡信息”簇return状态簇;}}二、 测试与调用示例
得益于上面的可读性优化,外部调用和数据验证的代码同样变得赏心悦目:
classProgram{staticvoidMain(string[]args){// 1. 模拟收到一段 36 字节的板卡原始物理报文byte[]物理接收缓冲区=newbyte[36];// 故意填入一些测试数据:物理接收缓冲区[0]=0x00;物理接收缓冲区[1]=0xFF;// 错误位1 = 255物理接收缓冲区[2]=0x02;物理接收缓冲区[3]=0x26;// 通道0原始值 = 550 -> 计算后应为 55.0物理接收缓冲区[4]=0x00;物理接收缓冲区[5]=0xEA;// 通道1原始值 = 234 -> 计算后应为 23.4物理接收缓冲区[34]=0x0A;物理接收缓冲区[35]=0x0B;// 错误位2 = 2571// 2. 调用解析:过程极其自然、直观var最终簇数据=OverCurrentBoardParserReadable.解析板卡数据(物理接收缓冲区);// 3. 打印输出验证Console.WriteLine("======================= 易读版解析面板 =======================");Console.WriteLine($"【错误状态位1】:{最终簇数据.错误状态位1}");Console.WriteLine($"【通道 0 (DBL)】:{最终簇数据.通道数据列表[0]}V");Console.WriteLine($"【通道 1 (DBL)】:{最终簇数据.通道数据列表[1]}A");Console.WriteLine($"【整个数组的大小】: 共{最终簇数据.通道数据列表.Count}个元素已安全插入簇中");Console.WriteLine($"【错误状态位2】:{最终簇数据.错误状态位2}");Console.WriteLine("=============================================================");}}💡 为什么说这段代码“更容易阅读”?
- 消灭了难以理解的位移符号:通过将
(buffer[0] << 8) | buffer[1]这种晦涩的计算机底层指令隐藏在强转U16()局部函数内,主业务逻辑中剩下的全是纯粹的步骤描述。 - 消灭了复杂的数学公式嵌套:将 DBL 类型转换与除以 10 的算术控件合二为一,变成了语义明确的
强转DBL并除以10()。 - 完全贴合 LabVIEW 框图视角:主方法里的四段逻辑(安全检查、第一路、第二路、第三路、返回簇)从上到下一气呵成,即使是刚接触 C# 的 LabVIEW 工程师也能一秒看懂。
编程学习
技术分享
实战经验