2026-05-06
C#
0

目录

📌 上节回顾
💡 核心知识讲解
先搞清楚:什么是"不该变的数据"?
const 的使用规则
再说"有限选项":什么时候用 enum?
enum 的底层是整数
const vs enum 怎么选?
💻 VS2026 操作步骤
📋 完整代码示例
🏭 工业实战小案例
⚠️ 避坑提醒
这几个坑,我替你踩过了
📝 本节总结

设备温度报警阈值,你是直接在代码里写的 85.0 吗?

三个月后,领导说"把报警温度改成 90 度"。你翻遍整个项目,发现 85.0 出现了 17 次——哪些是温度?哪些是别的参数?你已经分不清了。

改了 12 处,漏了 5 处,上线后某台注塑机没触发报警,差点出了事故。

这不是假设,这是很多工厂项目的真实故事。今天学完 constenum,这种问题你以后不会再有。


📌 上节回顾

上一节我们学了变量与数据类型,掌握了用 intdoublestringbool 存储不同类型数据的方法。

今天在这个基础上,我们进一步学习不会变的数据有限选项的数据该怎么定义。


💡 核心知识讲解

先搞清楚:什么是"不该变的数据"?

在工厂项目里,有些数值是写死在规格书里的——设备额定电压是 380V,圆周率是 3.14159,一条产线最多 64 个工位。

这些数据从项目立项到退役,永远不会变。如果你把它们写成普通变量,代码运行时理论上可以被修改,这是个隐患。

const(常量)就是给这类数据用的。 它告诉编译器:这个值定死了,谁都别想改。

// 错误方式:用变量存不变的数据 double voltage = 380.0; // 万一哪里不小心 voltage = 0,完蛋 // 正确方式:用常量 const double RatedVoltage = 380.0; // 改都改不了

const 的本质:编译时就把值固定下来,运行时无法修改。」


const 的使用规则

特性说明
声明时必须赋值const int Max = 100;
不能运行时赋值const int Max = GetMax();
支持的类型数字、字符串、bool、char
作用范围类内、方法内均可用

有一点要记住:const 只能存编译时就能确定的值。比如你不能把一个从数据库读出来的值赋给 const,因为那个值要运行时才知道。


再说"有限选项":什么时候用 enum

工厂里设备的运行状态,就那么几种:停机、运行、报警、维护

如果你用数字表示,0=停机,1=运行,2=报警,3=维护,代码里就会出现:

csharp
if (deviceStatus == 2) // 2 是什么?谁记得住?

三个月后,你自己都不记得 2 代表什么。

enum(枚举)就是把这些有限选项起个名字,统一管理。 用了枚举之后:

csharp
if (deviceStatus == DeviceStatus.Alarm) // 一眼就懂

「枚举的本质:给一组有限的选项,贴上人能读懂的标签。」


enum 的底层是整数

枚举在内存里存的其实是整数,默认从 0 开始自动编号。

csharp
enum DeviceStatus { Stopped = 0, // 停机 Running = 1, // 运行 Alarm = 2, // 报警 Maintain = 3 // 维护 }

你也可以手动指定数值,比如对接 PLC(可编程逻辑控制器,工厂里控制设备的"大脑")时,PLC 返回的状态码是 10、20、30,你可以直接写:

csharp
enum PlcStatus { Stopped = 10, Running = 20, Fault = 30 }

这样枚举值和 PLC 的状态码一一对应,读取数据时直接强制转换,省去了大量的 if-else 判断。


const vs enum 怎么选?

场景推荐用法
单个固定数值(如报警阈值)const
一组互斥的状态/类型enum
多个相关常量打包管理enum
需要和 PLC 状态码对应enum(手动赋值)

「记住这个口诀:一个值用 const,一组状态用 enum。」


💻 VS2026 操作步骤

Step 1 新建控制台项目

打开 VS2026,选择 文件 > 新建 > 项目,搜索"控制台应用",选择 .NET 10 框架,项目名填 IndustrialConstEnumDemo,点击创建。

image.png

Copilot 辅助: 创建完成后,在 Program.cs 顶部右键点击"使用 Copilot 解释此文件",可以快速了解 .NET 10 顶级语句(Top-level statements)结构。

Step 2 定义常量和枚举

Program.cs 同目录下,右键 添加 > 新建类,命名为 ProductionConfig.cs。在这个文件里集中定义所有 constenum,便于统一维护。

Copilot 辅助: 在类文件里输入注释 // 定义注塑机设备状态枚举,然后按 Tab 键,Copilot 会自动补全一个符合工业场景的枚举结构,你只需要核对状态名称是否正确。

Step 3 使用 Vibe Coding 生成枚举逻辑

在 Copilot Chat 面板中输入以下 Prompt:

Prompt 示例: "帮我写一个 C# 方法,接收一个 InjectionMachineStatus 枚举值,用 switch 表达式返回对应的中文状态描述字符串,枚举包含:待机、运行、报警、模具切换四种状态。"

Copilot 会直接生成完整方法。

Step 4 运行验证

F5 启动调试,在控制台窗口确认输出的状态描述与预期一致。如有报错,选中错误行,右键选择 "让 Copilot 修复",通常一键即可解决。


📋 完整代码示例

这段代码实现了一条注塑产线的设备状态管理和工艺参数定义,涵盖 const 常量声明、enum 枚举定义和状态判断逻辑。

csharp
public static class InjectionMachineConst { // 模具最高允许温度(摄氏度) public const double MaxMoldTemp = 280.0; // 注射压力上限(单位:bar) public const double MaxInjectionPressure = 1800.0; // 产线额定电压(单位:伏特) public const double RatedVoltage = 380.0; // 单模最大循环时间(单位:秒) public const int MaxCycleTimeSeconds = 120; // 产线编号前缀 public const string LinePrefix = "INJ-"; } // ---- 设备运行状态枚举(与 PLC 状态寄存器值对应)---- public enum InjectionMachineStatus { Standby = 0, // 待机 Running = 1, // 运行中 Alarm = 2, // 报警 MoldChange = 3, // 模具切换 Maintenance = 4 // 计划维护 } // ---- 报警等级枚举 ---- public enum AlarmLevel { Info = 1, // 提示(不影响生产) Warning = 2, // 警告(需关注) Critical = 3 // 严重(立即停机) } class Program { static void Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; // 支持控制台输出 Unicode 字符 Console.WriteLine("=== 注塑机监控系统 ==="); // 模拟从 PLC 读取的当前设备状态(实际项目中从通信接口获取) InjectionMachineStatus currentStatus = InjectionMachineStatus.Alarm; // 模拟当前模具温度传感器读数 double currentMoldTemp = 295.5; // 判断设备状态并输出描述 string statusDesc = GetStatusDescription(currentStatus); Console.WriteLine($"[{InjectionMachineConst.LinePrefix}01] 当前状态:{statusDesc}"); // 判断温度是否超过常量阈值 if (currentMoldTemp > InjectionMachineConst.MaxMoldTemp) { // 超温时触发严重报警 TriggerAlarm(AlarmLevel.Critical, $"模具温度超限:{currentMoldTemp}°C(上限 {InjectionMachineConst.MaxMoldTemp}°C)"); } } static string GetStatusDescription(InjectionMachineStatus status) => status switch { InjectionMachineStatus.Standby => "待机", InjectionMachineStatus.Running => "运行中", InjectionMachineStatus.Alarm => "⚠ 报警", InjectionMachineStatus.MoldChange => "模具切换中", InjectionMachineStatus.Maintenance => "计划维护", _ => "未知状态" }; // ---- 报警触发方法 ---- static void TriggerAlarm(AlarmLevel level, string message) { Console.WriteLine($"[报警] 等级:{level} | 信息:{message}"); } }

运行后你会在控制台看到:

image.png

两行输出清晰展示了设备状态和超温报警,所有判断逻辑都基于枚举和常量,没有一个"魔法数字"(Magic Number,指代码里来历不明的裸数字)出现。


🏭 工业实战小案例

场景任务: 某汽车焊接产线有 3 种焊接模式(点焊、缝焊、凸焊),需要根据当前模式输出对应的焊接电流参数上限。

思路拆解:

  • enum 定义 3 种焊接模式,值与 PLC 寄存器地址对应。
  • const 定义每种模式的电流上限(来自焊接工艺规范)。
  • 写一个方法,传入模式枚举,返回对应电流上限。
  • 主程序模拟 PLC 下发的模式值,输出参数。
csharp
using System; namespace IndustrialConstEnumDemo { // 焊接模式枚举(值与 PLC 寄存器定义一致) public enum WeldingMode { SpotWeld = 1, // 点焊 SeamWeld = 2, // 缝焊 ProjectionWeld = 3 // 凸焊 } // 各模式电流上限常量(单位:安培,来自工艺规范书) public static class WeldingConst { public const double SpotWeldMaxCurrent = 12000.0; public const double SeamWeldMaxCurrent = 8500.0; public const double ProjectionWeldMaxCurrent = 15000.0; } public class Program { // 根据焊接模式获取电流上限 public static double GetMaxCurrent(WeldingMode mode) { return mode switch { WeldingMode.SpotWeld => WeldingConst.SpotWeldMaxCurrent, WeldingMode.SeamWeld => WeldingConst.SeamWeldMaxCurrent, WeldingMode.ProjectionWeld => WeldingConst.ProjectionWeldMaxCurrent, _ => throw new ArgumentOutOfRangeException(nameof(mode), "未知焊接模式") }; } public static void Main() { // 模拟 PLC 下发模式为"缝焊" WeldingMode currentMode = WeldingMode.SeamWeld; double maxCurrent = GetMaxCurrent(currentMode); Console.WriteLine($"当前焊接模式:{currentMode},电流上限:{maxCurrent} A"); } } }

image.png

运行后输出 当前焊接模式:SeamWeld,电流上限:8500 A,清晰明了,换模式只改枚举值,参数自动跟着走。


⚠️ 避坑提醒

这几个坑,我替你踩过了

坑一:把 constreadonly 用,结果编译报错

❌ 错误做法:public const double Threshold = GetThresholdFromDB();

✅ 正确做法:public static readonly double Threshold = GetThresholdFromDB();

📌 原因:const 只能存编译时就确定的值,运行时才能算出来的值要用 readonly(只读变量)。


坑二:枚举和整数混着比较,逻辑出错

❌ 错误做法:if (currentStatus == 2) (直接用数字)

✅ 正确做法:if (currentStatus == DeviceStatus.Alarm)

📌 原因:直接用数字,代码可读性为零,而且枚举值一旦调整,所有裸数字判断全部失效,排查起来极其痛苦。


坑三:switch 漏写 default,新增枚举值时静默出错

❌ 错误做法:switchswitch 表达式里没有处理未知值的分支。

✅ 正确做法:始终加上 _ => throw new ArgumentOutOfRangeException(...)default: break;

📌 原因:将来同事新加了一个枚举值,没有 default 分支的 switch 会悄悄跳过,不报错也不执行,问题排查时让人崩溃。


📝 本节总结

「学完本节,你掌握了:」

const 锁定那些永远不该变的工艺参数,让"改一处、全局生效"成为可能。用 enum 给设备状态、工作模式这类有限选项起上人话名字,彻底告别代码里的"神秘数字"。知道了 const 只能存编译时常量,运行时动态值要用 readonly。也学会了枚举值可以手动对齐 PLC 寄存器,让通信代码更直观。

写出来的代码,不只是机器能跑,同事也能看懂——这才是工业项目代码该有的样子。


📖 本文是《C# 工业数字化应用开发专家》系列第 010 节

上一节:【变量与数据类型:int、double、string、bool】

下一节:【类型转换:隐式、显式与 Convert 类】


💬 你在项目里有没有因为"魔法数字"踩过坑?

欢迎在评论区说说你的故事,也许下一篇的案例就来自你的产线。

🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这 420 节,从工厂小白到工业软件开发专家,我们一起走。


#C#编程入门 #工业数字化 #工厂自动化 #PLC编程 #工业软件开发

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!