为了让代码极具可读性、结构清晰,并且彻底摆脱各种复杂的底层字符编码,我们应该引入 C# 现代开发中最推崇的面向对象与表现力原则
为了让代码极具可读性、结构清晰并且彻底摆脱各种复杂的底层字符编码我们应该引入 C# 现代开发中最推崇的面向对象与表现力原则。我们可以通过两点优化来大幅提升可阅读性使用C# 局部函数Local Functions让“截取”、“强转大端”等动作读起来就像普通的中文指令。使用C# 元组Tuple或类构造器替代生硬的数组索引让每一路数据在放进“簇Cluster”的时候都有清晰的业务名字比如过流保护、通道电压。以下是为你量身定制的最易读、最具业务表达力的 C# 完整解析代码一、 易读版核心解析实现usingSystem;usingSystem.Collections.Generic;publicclassOverCurrentBoardParserReadable{/// summary/// 对应 LabVIEW 的“过流保护板状态簇”/// 将原本没有名字的数组元素直接映射为带有明确业务含义的属性可读性极高。/// /summarypublicclassOverCurrentBoardStatus{publicushort错误状态位1{get;set;}// 模拟 LabVIEW 中被解包出来的 16 个 DBL 通道数据你可以根据板卡说明书进一步改成具体的“电压/电流”名字publicListdouble通道数据列表{get;set;}newListdouble();publicushort错误状态位2{get;set;}}/// summary/// 极易阅读的解析方法/// /summary/// param name原始字节数组上游通信直接收到的 byte[] 缓冲区/parampublicstaticOverCurrentBoardStatus 解析板卡数据(byte[]原始字节数组){// 边界安全检查如果数据长度不足 36 字节直接返回空簇防止程序崩溃if(原始字节数组null||原始字节数组.Length36)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(inti0;i16;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 工程师也能一秒看懂。
