注塑机料筒温度传感器数据已经读进来了,你打开 VS,准备写判断逻辑:温度正常就继续生产,温度偏高就报警,温度过高就紧急停机。
听起来很简单,结果写出来的代码要么判断顺序错了,要么 switch 写了一半发现不知道怎么匹配范围……
这种感觉,像极了拿着对的零件却装错了位置。
今天这篇,就把条件语句这块彻底理清楚。
「上一节我们学了字符串操作,掌握了拼接、格式化和插值表达式($"..." 写法)的用法。
今天在这个基础上,我们进一步学习如何用条件语句,让程序根据不同的数据做出不同的判断和响应。」
你在工厂里做质检,看到产品尺寸偏大就打回返工,尺寸正常就放行,尺寸偏小就报废。
程序也一样——它需要根据数据的不同,走不同的处理路径。
C# 里实现这个能力,靠的就是条件语句。
最基础的三种:if、else if、switch。
if 就是一个门卫:条件满足,放行;不满足,拦住。
csharpif (deviceTemp > 80)
{
// 温度超过80°C,触发报警
TriggerAlarm();
}
只有 deviceTemp(设备温度)超过 80 时,TriggerAlarm()(触发报警)才会执行。
否则,这段代码直接跳过,什么都不做。
实际工厂场景里,"是/否"往往不够用。
温度有正常区间、预警区间、危险区间,每个区间要做不同的事。
这时候就需要 else if 来扩展判断分支:
csharpif (deviceTemp < 60)
{
// 温度偏低,设备预热中
ShowStatus("预热中");
}
else if (deviceTemp >= 60 && deviceTemp <= 80)
{
// 温度正常,允许生产
ShowStatus("正常生产");
}
else if (deviceTemp > 80 && deviceTemp <= 100)
{
// 温度偏高,触发预警
TriggerWarning();
}
else
{
// 温度超过100°C,紧急停机
EmergencyStop();
}
else(否则)是兜底分支,前面所有条件都不满足时才执行。
「记住:if 到 else if 的判断是从上往下依次检查,一旦某个条件命中,后面的分支就不再判断了。」
| 写法 | 执行特点 | 适用场景 |
|---|---|---|
多个独立 if | 每个 if 都会被判断 | 条件互不影响时 |
if + else if | 命中一个就停止 | 条件互斥、分级判断 |
if + else | 非此即彼 | 只有两种结果时 |
温控报警这种分级场景,一定要用 if + else if,不要写多个独立 if——否则温度 105°C 时,报警和停机可能会同时触发。
switch(开关/选择)适合处理固定值的匹配,比如设备的运行模式编号、错误代码、班次编号等。
csharpint productionShift = 2; // 当前班次:1=早班 2=中班 3=晚班
switch (productionShift)
{
case 1:
Console.WriteLine("早班:06:00 - 14:00");
break;
case 2:
Console.WriteLine("中班:14:00 - 22:00");
break;
case 3:
Console.WriteLine("晚班:22:00 - 06:00");
break;
default:
Console.WriteLine("未知班次,请核查数据");
break;
}
case(情况)是每个匹配分支,default(默认)是兜底处理,break(跳出)是结束当前分支的必要语句。
| 判断类型 | 推荐用法 |
|---|---|
| 数值范围(大于/小于) | if / else if |
| 固定值精确匹配 | switch |
| 字符串、枚举匹配 | switch(更清晰) |
| 条件超过 5 个分支 | 优先考虑 switch |
「switch 不能直接判断范围,比如"大于80"这种写法在传统 switch 里是不支持的。这个限制,下一节的模式匹配会彻底解决。」
Step 1 新建控制台项目
打开 VS2026,选择 新建项目 > 控制台应用 (.NET 10),项目名称填写 ConditionDemo,点击创建。
VS2026 Copilot 辅助:创建完成后,Copilot 会在右侧面板。
Step 2 打开 Program.cs,定位到 Main 方法入口
在代码编辑器中找到 static void Main(string[] args) 这一行,所有练习代码写在这里面。
VS2026 Copilot 辅助:在空行输入
// 判断设备温度状态后回车,Copilot 会自动补全一段if-else if温控判断模板,可以在此基础上修改。
Step 3 输入本节示例代码,按 F5 运行
代码输入完成后,直接按 F5(或点击顶部绿色运行按钮)启动调试。
控制台窗口会弹出,显示当前温度对应的状态信息。
VS2026 Copilot 辅助:运行出错时,Copilot 会在错误行下方显示修复建议气泡,点击"Fix with Copilot"可一键定位问题并给出修改方案。
Step 4 修改变量值,观察不同分支的执行结果
把代码里的 deviceTemp 分别改成 50、75、90、110,每次按 F5 运行,观察输出变化,加深对分支逻辑的理解。
如果你想用 Vibe Coding(用自然语言描述需求,让 AI 直接生成代码)来完成本节练习,可以这样写 Prompt:
「用 C# 14 写一段控制台程序,模拟注塑机料筒温度判断逻辑:温度低于60°C 显示"预热中",60
80°C 显示"正常生产",80100°C 触发预警并打印报警信息,超过100°C 执行紧急停机并打印停机原因。变量名使用有工业语义的英文命名,每个分支加中文注释。」

Copilot 会根据这段描述直接生成完整代码,你再对照本节内容理解逻辑即可。
这段代码实现了一个注塑机料筒温度的多级状态判断,覆盖预热、正常生产、预警和紧急停机四个状态。
csharpusing System;
namespace ConditionDemo
{
class Program
{
static void Main(string[] args)
{
// 模拟从传感器读取的料筒当前温度(单位:°C)
double deviceTemp = 95.6;
// 报警阈值定义
double warmUpThreshold = 60.0; // 预热完成温度
double normalUpperLimit = 80.0; // 正常生产上限温度
double alarmThreshold = 100.0; // 紧急停机触发温度
Console.WriteLine($"当前料筒温度:{deviceTemp}°C");
Console.WriteLine("----------------------------");
// 多级温度状态判断
if (deviceTemp < warmUpThreshold)
{
// 温度未达预热温度,禁止生产
Console.WriteLine("【状态】预热中,请等待温度上升");
Console.WriteLine("提示:当前温度未达生产要求,禁止启动注塑");
}
else if (deviceTemp >= warmUpThreshold && deviceTemp <= normalUpperLimit)
{
// 温度处于正常生产区间
Console.WriteLine("【状态】温度正常,允许生产");
Console.WriteLine($"当前温度 {deviceTemp}°C 在正常范围内({warmUpThreshold}~{normalUpperLimit}°C)");
}
else if (deviceTemp > normalUpperLimit && deviceTemp <= alarmThreshold)
{
// 温度偏高,触发预警但尚未停机
Console.WriteLine("【警告】温度偏高,已触发预警!");
Console.WriteLine($"当前温度 {deviceTemp}°C 超过上限 {normalUpperLimit}°C,请检查冷却系统");
TriggerAlarm(deviceTemp);
}
else
{
// 温度超过紧急阈值,执行停机保护
Console.WriteLine("【紧急停机】温度严重超标,已执行保护性停机!");
Console.WriteLine($"当前温度 {deviceTemp}°C 超过停机阈值 {alarmThreshold}°C");
EmergencyStop(deviceTemp);
}
Console.WriteLine("----------------------------");
// 用 switch 判断当前生产班次
int currentShift = GetCurrentShift();
Console.WriteLine($"\n当前班次编号:{currentShift}");
switch (currentShift)
{
case 1:
Console.WriteLine("班次:早班(06:00 - 14:00),班组长:张工");
break;
case 2:
Console.WriteLine("班次:中班(14:00 - 22:00),班组长:李工");
break;
case 3:
Console.WriteLine("班次:晚班(22:00 - 06:00),班组长:王工");
break;
default:
Console.WriteLine("班次数据异常,请联系MES系统管理员核查");
break;
}
Console.ReadKey();
}
// 触发预警:记录报警信息
static void TriggerAlarm(double temp)
{
Console.WriteLine($"[报警记录] 时间:{DateTime.Now:HH:mm:ss},温度:{temp}°C,级别:预警");
}
// 紧急停机:记录停机原因
static void EmergencyStop(double temp)
{
Console.WriteLine($"[停机记录] 时间:{DateTime.Now:HH:mm:ss},温度:{temp}°C,原因:超温保护");
}
// 模拟获取当前班次(实际项目中从MES或PLC读取)
static int GetCurrentShift()
{
int hour = DateTime.Now.Hour;
if (hour >= 6 && hour < 14) return 1;
else if (hour >= 14 && hour < 22) return 2;
else return 3;
}
}
}

运行后,控制台会先输出当前温度 95.6°C 对应的"温度偏高预警"信息,并打印带时间戳的报警记录。接着程序会根据你电脑的系统时间,自动判断当前班次并输出对应班组长姓名。把 deviceTemp 改成不同数值再运行,你会看到四个不同的状态分支被触发。
场景任务: 冲压车间的压力机有三种运行模式(手动=0、半自动=1、全自动=2),需要根据模式编号显示对应的安全提示,并对非法模式编号给出错误提示。
思路拆解:
switch 匹配default 兜底csharpusing System;
namespace PressOperationMode
{
class Program
{
static void Main(string[] args)
{
// 从PLC读取的压力机当前运行模式编号(0=手动 1=半自动 2=全自动)
int operationMode = 2;
Console.WriteLine("【压力机安全提示系统】");
Console.WriteLine($"当前模式编号:{operationMode}");
switch (operationMode)
{
case 0:
Console.WriteLine("模式:手动");
Console.WriteLine("⚠ 安全提示:手动模式下设备随时可能动作,操作员必须保持双手可见!");
break;
case 1:
Console.WriteLine("模式:半自动");
Console.WriteLine("⚠ 安全提示:单次触发后设备自动完成一个冲压循环,注意手部安全!");
break;
case 2:
Console.WriteLine("模式:全自动");
Console.WriteLine("⚠ 安全提示:设备持续运行中,严禁进入安全围栏区域!");
break;
default:
Console.WriteLine("❌ 模式编号异常,请检查PLC数据或联系维护工程师!");
break;
}
Console.ReadKey();
}
}
}

运行后,控制台输出"模式:全自动"及对应安全警示。把 operationMode 改成 99,default 分支会立刻触发数据异常提示——这在实际工控程序里是非常重要的容错设计。
坑一:多个独立 if 导致逻辑冲突
❌ 错误做法:
csharpif (deviceTemp > 80) TriggerWarning();
if (deviceTemp > 100) EmergencyStop();
✅ 正确做法:
csharpif (deviceTemp > 100) EmergencyStop();
else if (deviceTemp > 80) TriggerWarning();
📌 原因:温度 105°C 时,两个独立 if 会同时触发,报警和停机并发执行,逻辑混乱;改用 else if 后,命中停机条件就不再判断预警。
坑二:switch 的 case 忘写 break
❌ 错误做法:
csharpcase 1:
Console.WriteLine("早班");
case 2:
Console.WriteLine("中班"); // 早班也会执行这里!
break;
✅ 正确做法:
csharpcase 1:
Console.WriteLine("早班");
break; // 每个 case 必须有 break
case 2:
Console.WriteLine("中班");
break;
📌 原因:C# 里 case 不会自动停止,忘写 break 会"穿透"到下一个 case 继续执行,这是初学者最容易忽略的细节。
坑三:浮点数用 == 判断相等
❌ 错误做法:
csharpif (deviceTemp == 80.0) // 传感器数据几乎不可能精确等于某个值
✅ 正确做法:
csharpif (deviceTemp >= 79.9 && deviceTemp <= 80.1) // 用范围判断代替精确相等
📌 原因:传感器采集的浮点数(小数类型数据)存在精度误差,== 判断几乎永远不会命中,必须改用范围判断。
「学完本节,你掌握了:」
if 和 else if 的分级判断逻辑,能处理温度、压力等连续数值的多区间状态判断。switch 的精确匹配用法,适合处理班次编号、模式编号等固定值场景。你清楚了两者的选用边界,知道什么时候该用哪个。同时也规避了"多个独立 if 逻辑冲突"、"忘写 break 导致穿透"、"浮点数不能用 == 判断"这三个高频陷阱。
条件语句是工控程序的骨架,写对了,后面的报警、联锁、状态机都会顺很多。
📖 本文是《C# 工业数字化应用开发专家》系列第 014 节
上一节:【字符串操作:拼接、格式化、插值表达式】
下一节:【C# 14 新特性:switch 表达式模式匹配进阶】
💬 你在工作中有没有遇到过设备状态判断逻辑写乱的情况?
欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。
🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这 420 节,从工厂小白到工业软件开发专家,我们一起走。
#C#编程 #工业数字化 #工控开发入门 #制造业IT #程序员成长
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!