2026-05-13
C#
0

目录

🔧 开篇钩子
📌 上节回顾
💡 核心知识讲解
程序也需要"判断力"
if 语句:最基本的"是/否"判断
else if:多条件分支,像档位一样
if vs else if:一个对比帮你记清楚
switch:精确匹配,像拨码开关
if 和 switch 怎么选?
💻 VS2026 操作步骤
Vibe Coding 提示词写法
📋 完整代码示例
🏭 工业实战小案例
⚠️ 避坑提醒
这几个坑,我替你踩过了
📝 本节总结

🔧 开篇钩子

注塑机料筒温度传感器数据已经读进来了,你打开 VS,准备写判断逻辑:温度正常就继续生产,温度偏高就报警,温度过高就紧急停机。

听起来很简单,结果写出来的代码要么判断顺序错了,要么 switch 写了一半发现不知道怎么匹配范围……

这种感觉,像极了拿着对的零件却装错了位置。

今天这篇,就把条件语句这块彻底理清楚。


📌 上节回顾

「上一节我们学了字符串操作,掌握了拼接、格式化和插值表达式($"..." 写法)的用法。

今天在这个基础上,我们进一步学习如何用条件语句,让程序根据不同的数据做出不同的判断和响应。」


💡 核心知识讲解

程序也需要"判断力"

你在工厂里做质检,看到产品尺寸偏大就打回返工,尺寸正常就放行,尺寸偏小就报废。

程序也一样——它需要根据数据的不同,走不同的处理路径。

C# 里实现这个能力,靠的就是条件语句

最基础的三种:ifelse ifswitch


if 语句:最基本的"是/否"判断

if 就是一个门卫:条件满足,放行;不满足,拦住。

csharp
if (deviceTemp > 80) { // 温度超过80°C,触发报警 TriggerAlarm(); }

只有 deviceTemp(设备温度)超过 80 时,TriggerAlarm()(触发报警)才会执行。

否则,这段代码直接跳过,什么都不做。


else if:多条件分支,像档位一样

实际工厂场景里,"是/否"往往不够用。

温度有正常区间、预警区间、危险区间,每个区间要做不同的事。

这时候就需要 else if 来扩展判断分支:

csharp
if (deviceTemp < 60) { // 温度偏低,设备预热中 ShowStatus("预热中"); } else if (deviceTemp >= 60 && deviceTemp <= 80) { // 温度正常,允许生产 ShowStatus("正常生产"); } else if (deviceTemp > 80 && deviceTemp <= 100) { // 温度偏高,触发预警 TriggerWarning(); } else { // 温度超过100°C,紧急停机 EmergencyStop(); }

else(否则)是兜底分支,前面所有条件都不满足时才执行。

「记住:ifelse if 的判断是从上往下依次检查,一旦某个条件命中,后面的分支就不再判断了。」


if vs else if:一个对比帮你记清楚

写法执行特点适用场景
多个独立 if每个 if 都会被判断条件互不影响时
if + else if命中一个就停止条件互斥、分级判断
if + else非此即彼只有两种结果时

温控报警这种分级场景,一定要用 if + else if,不要写多个独立 if——否则温度 105°C 时,报警和停机可能会同时触发。


switch:精确匹配,像拨码开关

switch(开关/选择)适合处理固定值的匹配,比如设备的运行模式编号、错误代码、班次编号等。

csharp
int 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 和 switch 怎么选?

判断类型推荐用法
数值范围(大于/小于)if / else if
固定值精确匹配switch
字符串、枚举匹配switch(更清晰)
条件超过 5 个分支优先考虑 switch

switch 不能直接判断范围,比如"大于80"这种写法在传统 switch 里是不支持的。这个限制,下一节的模式匹配会彻底解决。」


💻 VS2026 操作步骤

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 分别改成 507590110,每次按 F5 运行,观察输出变化,加深对分支逻辑的理解。


Vibe Coding 提示词写法

如果你想用 Vibe Coding(用自然语言描述需求,让 AI 直接生成代码)来完成本节练习,可以这样写 Prompt:

「用 C# 14 写一段控制台程序,模拟注塑机料筒温度判断逻辑:温度低于60°C 显示"预热中",6080°C 显示"正常生产",80100°C 触发预警并打印报警信息,超过100°C 执行紧急停机并打印停机原因。变量名使用有工业语义的英文命名,每个分支加中文注释。」

image.png

Copilot 会根据这段描述直接生成完整代码,你再对照本节内容理解逻辑即可。


📋 完整代码示例

这段代码实现了一个注塑机料筒温度的多级状态判断,覆盖预热、正常生产、预警和紧急停机四个状态。

csharp
using 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; } } }

image.png

运行后,控制台会先输出当前温度 95.6°C 对应的"温度偏高预警"信息,并打印带时间戳的报警记录。接着程序会根据你电脑的系统时间,自动判断当前班次并输出对应班组长姓名。把 deviceTemp 改成不同数值再运行,你会看到四个不同的状态分支被触发。


🏭 工业实战小案例

场景任务: 冲压车间的压力机有三种运行模式(手动=0、半自动=1、全自动=2),需要根据模式编号显示对应的安全提示,并对非法模式编号给出错误提示。

思路拆解:

  • 模式编号是固定整数值,优先用 switch 匹配
  • 手动模式安全风险最高,提示最严格
  • 全自动模式需提醒操作员不得进入安全围栏
  • 编号不在 0~2 范围内,说明数据异常,走 default 兜底
csharp
using 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(); } } }

image.png

运行后,控制台输出"模式:全自动"及对应安全警示。把 operationMode 改成 99default 分支会立刻触发数据异常提示——这在实际工控程序里是非常重要的容错设计。


⚠️ 避坑提醒

这几个坑,我替你踩过了

坑一:多个独立 if 导致逻辑冲突

❌ 错误做法:

csharp
if (deviceTemp > 80) TriggerWarning(); if (deviceTemp > 100) EmergencyStop();

✅ 正确做法:

csharp
if (deviceTemp > 100) EmergencyStop(); else if (deviceTemp > 80) TriggerWarning();

📌 原因:温度 105°C 时,两个独立 if 会同时触发,报警和停机并发执行,逻辑混乱;改用 else if 后,命中停机条件就不再判断预警。


坑二:switch 的 case 忘写 break

❌ 错误做法:

csharp
case 1: Console.WriteLine("早班"); case 2: Console.WriteLine("中班"); // 早班也会执行这里! break;

✅ 正确做法:

csharp
case 1: Console.WriteLine("早班"); break; // 每个 case 必须有 break case 2: Console.WriteLine("中班"); break;

📌 原因:C# 里 case 不会自动停止,忘写 break 会"穿透"到下一个 case 继续执行,这是初学者最容易忽略的细节。


坑三:浮点数用 == 判断相等

❌ 错误做法:

csharp
if (deviceTemp == 80.0) // 传感器数据几乎不可能精确等于某个值

✅ 正确做法:

csharp
if (deviceTemp >= 79.9 && deviceTemp <= 80.1) // 用范围判断代替精确相等

📌 原因:传感器采集的浮点数(小数类型数据)存在精度误差,== 判断几乎永远不会命中,必须改用范围判断。


📝 本节总结

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

ifelse if 的分级判断逻辑,能处理温度、压力等连续数值的多区间状态判断。switch 的精确匹配用法,适合处理班次编号、模式编号等固定值场景。你清楚了两者的选用边界,知道什么时候该用哪个。同时也规避了"多个独立 if 逻辑冲突"、"忘写 break 导致穿透"、"浮点数不能用 == 判断"这三个高频陷阱。

条件语句是工控程序的骨架,写对了,后面的报警、联锁、状态机都会顺很多。


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

上一节:【字符串操作:拼接、格式化、插值表达式】

下一节:【C# 14 新特性:switch 表达式模式匹配进阶】


💬 你在工作中有没有遇到过设备状态判断逻辑写乱的情况?

欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。

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


#C#编程 #工业数字化 #工控开发入门 #制造业IT #程序员成长

本文作者:技术老小子

本文链接:

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