设备温度报警阈值,你是直接在代码里写的 85.0 吗?
三个月后,领导说"把报警温度改成 90 度"。你翻遍整个项目,发现 85.0 出现了 17 次——哪些是温度?哪些是别的参数?你已经分不清了。
改了 12 处,漏了 5 处,上线后某台注塑机没触发报警,差点出了事故。
这不是假设,这是很多工厂项目的真实故事。今天学完 const 和 enum,这种问题你以后不会再有。
上一节我们学了变量与数据类型,掌握了用 int、double、string、bool 存储不同类型数据的方法。
今天在这个基础上,我们进一步学习不会变的数据和有限选项的数据该怎么定义。
在工厂项目里,有些数值是写死在规格书里的——设备额定电压是 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=维护,代码里就会出现:
csharpif (deviceStatus == 2) // 2 是什么?谁记得住?
三个月后,你自己都不记得 2 代表什么。
enum(枚举)就是把这些有限选项起个名字,统一管理。 用了枚举之后:
csharpif (deviceStatus == DeviceStatus.Alarm) // 一眼就懂
「枚举的本质:给一组有限的选项,贴上人能读懂的标签。」
enum 的底层是整数枚举在内存里存的其实是整数,默认从 0 开始自动编号。
csharpenum DeviceStatus
{
Stopped = 0, // 停机
Running = 1, // 运行
Alarm = 2, // 报警
Maintain = 3 // 维护
}
你也可以手动指定数值,比如对接 PLC(可编程逻辑控制器,工厂里控制设备的"大脑")时,PLC 返回的状态码是 10、20、30,你可以直接写:
csharpenum PlcStatus
{
Stopped = 10,
Running = 20,
Fault = 30
}
这样枚举值和 PLC 的状态码一一对应,读取数据时直接强制转换,省去了大量的 if-else 判断。
const vs enum 怎么选?| 场景 | 推荐用法 |
|---|---|
| 单个固定数值(如报警阈值) | const |
| 一组互斥的状态/类型 | enum |
| 多个相关常量打包管理 | enum |
| 需要和 PLC 状态码对应 | enum(手动赋值) |
「记住这个口诀:一个值用 const,一组状态用 enum。」
Step 1 新建控制台项目
打开 VS2026,选择 文件 > 新建 > 项目,搜索"控制台应用",选择 .NET 10 框架,项目名填 IndustrialConstEnumDemo,点击创建。

Copilot 辅助: 创建完成后,在
Program.cs顶部右键点击"使用 Copilot 解释此文件",可以快速了解 .NET 10 顶级语句(Top-level statements)结构。
Step 2 定义常量和枚举
在 Program.cs 同目录下,右键 添加 > 新建类,命名为 ProductionConfig.cs。在这个文件里集中定义所有 const 和 enum,便于统一维护。
Copilot 辅助: 在类文件里输入注释
// 定义注塑机设备状态枚举,然后按Tab键,Copilot 会自动补全一个符合工业场景的枚举结构,你只需要核对状态名称是否正确。
Step 3 使用 Vibe Coding 生成枚举逻辑
在 Copilot Chat 面板中输入以下 Prompt:
Prompt 示例: "帮我写一个 C# 方法,接收一个
InjectionMachineStatus枚举值,用 switch 表达式返回对应的中文状态描述字符串,枚举包含:待机、运行、报警、模具切换四种状态。"

Copilot 会直接生成完整方法。
Step 4 运行验证
按 F5 启动调试,在控制台窗口确认输出的状态描述与预期一致。如有报错,选中错误行,右键选择 "让 Copilot 修复",通常一键即可解决。
这段代码实现了一条注塑产线的设备状态管理和工艺参数定义,涵盖 const 常量声明、enum 枚举定义和状态判断逻辑。
csharppublic 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}");
}
}
运行后你会在控制台看到:

两行输出清晰展示了设备状态和超温报警,所有判断逻辑都基于枚举和常量,没有一个"魔法数字"(Magic Number,指代码里来历不明的裸数字)出现。
场景任务: 某汽车焊接产线有 3 种焊接模式(点焊、缝焊、凸焊),需要根据当前模式输出对应的焊接电流参数上限。
思路拆解:
enum 定义 3 种焊接模式,值与 PLC 寄存器地址对应。const 定义每种模式的电流上限(来自焊接工艺规范)。csharpusing 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");
}
}
}

运行后输出 当前焊接模式:SeamWeld,电流上限:8500 A,清晰明了,换模式只改枚举值,参数自动跟着走。
坑一:把 const 当 readonly 用,结果编译报错
❌ 错误做法:public const double Threshold = GetThresholdFromDB();
✅ 正确做法:public static readonly double Threshold = GetThresholdFromDB();
📌 原因:const 只能存编译时就确定的值,运行时才能算出来的值要用 readonly(只读变量)。
坑二:枚举和整数混着比较,逻辑出错
❌ 错误做法:if (currentStatus == 2) (直接用数字)
✅ 正确做法:if (currentStatus == DeviceStatus.Alarm)
📌 原因:直接用数字,代码可读性为零,而且枚举值一旦调整,所有裸数字判断全部失效,排查起来极其痛苦。
坑三:switch 漏写 default,新增枚举值时静默出错
❌ 错误做法:switch 或 switch 表达式里没有处理未知值的分支。
✅ 正确做法:始终加上 _ => 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 许可协议。转载请注明出处!