产线上有32个温度传感器,领导说:"把超温的设备都标红,做到监控界面上。"
你打开 VS2026,新建了一个 List,然后……开始一个一个写 if?
写到第5个,手已经酸了。
其实,这件事交给循环语句,3行代码就能解决。
今天这节,就是专门为这类"重复性操作"准备的。
「上一节我们学了 switch 表达式模式匹配进阶,掌握了用简洁语法替代复杂多分支判断的方法。今天在这个基础上,我们进一步学习循环语句——当条件判断需要反复执行时,循环就是你的下一件武器。」
工厂里有一条冲压流水线,每隔5秒冲压一次,直到今天的生产计划完成为止。
这就是循环的本质:在满足条件的情况下,重复执行同一段操作。
C# 提供了4种循环语句,各有侧重,不是随便选一个就行的。
| 循环类型 | 适用场景 | 工厂类比 |
|---|---|---|
for | 已知次数的重复 | 生产计划:今天做500件 |
while | 条件满足就继续 | 设备温度没降下来就持续报警 |
do-while | 至少执行一次 | 开机自检,先跑一遍再判断 |
foreach | 遍历集合中每个元素 | 逐一检查所有传感器状态 |
for 循环适合你明确知道要循环多少次的场景。
语法结构是:for (初始值; 条件; 每次变化)
for (int i = 0; i < 500; i++) { // 冲压一次 }
「i 就是计数器,从0开始,每次加1,到499停止,正好500次。」
工厂里批量写入设备编号、生成巡检记录序号,都是这个套路。
while 循环适合不知道要循环几次,但知道什么时候停的场景。
只要括号里的条件是 true,就一直跑。
while (deviceTemp > alarmThreshold) { // 持续触发报警 }
⚠️ 注意:如果条件永远是
true,程序会死循环卡死。必须确保循环体内有改变条件的逻辑。
do-while 和 while 的区别只有一个:先执行,再判断。
哪怕条件一开始就不满足,也会至少跑一遍。
do { // 执行一次自检 } while (selfCheckResult == false);
类比工厂:设备上电后,必须先跑一次自检程序,通过了才进入正常运行模式。
「先做一次,是 do-while 的核心特征。」
foreach 专门用来遍历集合(列表、数组等)中的每一个元素。
不需要手动管计数器,代码更简洁,也更不容易出错。
foreach (var sensor in sensorList) { // 检查每个传感器 }
sensorList 是传感器列表,sensor 是每次循环取出的那一个。
工厂里的设备台账、报警记录列表、班次数据——凡是"一批数据逐条处理",优先选 foreach。
Step 1:新建控制台项目
打开 VS2026,选择 文件 > 新建 > 项目,搜索"控制台应用",选择 .NET 10 框架,项目名建议命名为 LoopDemo,点击创建。
VS2026 Copilot 辅助:项目创建完成后,Copilot 会自动在
Program.cs中生成顶级语句(top-level statements)模板,直接在其中编写循环代码即可,无需手动写Main方法。
Step 2:输入代码并触发 Copilot 补全
在 Program.cs 中输入注释 // 遍历所有传感器,超温则报警,然后按回车。
VS2026 Copilot 会根据注释内容自动推断并补全循环结构,包括变量名、条件判断和输出语句。
如果补全内容不符合预期,按
Tab接受当前建议,还可以试一下Alt + →
Step 3:运行调试
按 F5 启动调试,在"输出"窗口查看每次循环的打印结果。
如需逐步查看循环执行过程,在 foreach 行左侧点击添加断点(红点),再按 F5,每次按 F10 单步执行,可在"局部变量"窗口实时看到 sensor 的当前值。
如果你想让 Copilot 直接帮你生成完整的循环逻辑,可以这样写 Prompt:
// 我有一个设备温度列表 deviceTempList,类型是 List<double> // 请用 foreach 遍历,找出超过85度的设备并打印编号和温度 // 设备编号从1开始
写完注释后,Copilot 会自动生成完整代码块,你只需确认逻辑是否正确即可。
这段代码模拟了一条注塑产线的温度巡检系统:遍历所有模具温度传感器,统计超温数量,并输出报警信息。
csharp// 注塑产线温度巡检系统 - 循环语句综合演示
// 运行环境:VS2026 + .NET 10 + C# 14
using System;
using System.Collections.Generic;
// 模拟传感器数据(实际项目中来自 OPC UA 或 Modbus 读取)
List<(int SensorId, double Temperature)> sensorDataList = new()
{
(1, 72.5),
(2, 88.3), // 超温
(3, 65.0),
(4, 91.7), // 超温
(5, 78.2),
(6, 55.4),
(7, 86.1), // 超温
(8, 70.9)
};
// 报警阈值(注塑模具温度上限)
double alarmThreshold = 85.0;
// 超温计数器
int overTempCount = 0;
Console.OutputEncoding=System.Text.Encoding.UTF8; // 支持输出中文和表情符号
Console.WriteLine("===== 注塑产线温度巡检开始 =====\n");
// 使用 foreach 遍历所有传感器数据
foreach (var sensor in sensorDataList)
{
// 判断是否超温
if (sensor.Temperature > alarmThreshold)
{
overTempCount++;
Console.WriteLine($"[⚠️ 报警] 传感器 #{sensor.SensorId} 温度:{sensor.Temperature}°C,已超阈值 {alarmThreshold}°C");
}
else
{
Console.WriteLine($"[ 正常] 传感器 #{sensor.SensorId} 温度:{sensor.Temperature}°C");
}
}
Console.WriteLine($"\n===== 巡检完成 =====");
Console.WriteLine($"共检测传感器:{sensorDataList.Count} 个");
Console.WriteLine($"超温传感器数:{overTempCount} 个");
// 使用 for 循环生成本次巡检的批次编号(模拟写入日志)
Console.WriteLine("\n----- 本次巡检批次编号生成 -----");
for (int i = 1; i <= overTempCount; i++)
{
// 格式:年月日 + 序号,例如 20260416-001
string alarmRecordId = $"20260416-{i:D3}";
Console.WriteLine($"报警记录编号已生成:{alarmRecordId}");
}
// 使用 while 循环模拟等待设备降温(简化版)
double currentTemp = 91.7;
int coolingSeconds = 0;
Console.WriteLine("\n----- 模拟设备 #4 降温过程 -----");
// 每次循环模拟降温1度,直到温度低于阈值
while (currentTemp > alarmThreshold)
{
currentTemp -= 1.5;
coolingSeconds += 10;
Console.WriteLine($" 降温中... 当前温度:{currentTemp:F1}°C(已等待 {coolingSeconds} 秒)");
}
Console.WriteLine($"设备 #4 已恢复正常,当前温度:{currentTemp:F1}°C");
// 使用 do-while 模拟开机自检(至少执行一次)
Console.WriteLine("\n----- 设备 #4 重启自检 -----");
bool selfCheckPassed = false;
int checkCount = 0;
do
{
checkCount++;
// 模拟第2次自检通过
selfCheckPassed = (checkCount >= 2);
Console.WriteLine($" 第 {checkCount} 次自检:{(selfCheckPassed ? "通过 ✅" : "未通过,重试...")}");
} while (!selfCheckPassed);
Console.WriteLine("设备自检完成,进入正常运行模式。");

运行后,控制台会依次输出每个传感器的温度状态,标红报警的传感器编号,并自动生成报警记录批次号。接着模拟设备降温过程,最后完成开机自检流程。4种循环语句在同一个工业场景下协同工作的效果,一眼就能看清楚。
场景任务: 汽车焊接产线有20个焊枪,每个焊枪有一个当日焊点计数值,统计出焊点数低于800的焊枪编号,生成欠产预警报告。
思路拆解:
for 循环遍历数组,下标就是焊枪编号csharp// 汽车焊接产线 - 焊枪欠产预警
// 运行环境:VS2026 + .NET 10 + C# 14
int[] weldingPointCounts = {
920, 780, 850, 760, 910,
830, 690, 970, 800, 750,
880, 810, 740, 960, 820,
770, 900, 680, 840, 790
};
// 欠产阈值
int productionThreshold = 800;
int underProductionCount = 0;
Console.WriteLine("===== 焊枪欠产预警报告 =====");
for (int gunIndex = 0; gunIndex < weldingPointCounts.Length; gunIndex++)
{
int weldCount = weldingPointCounts[gunIndex];
if (weldCount < productionThreshold)
{
underProductionCount++;
Console.WriteLine($"[预警] 焊枪 #{gunIndex + 1:D2} 今日焊点数:{weldCount},低于计划 {productionThreshold - weldCount} 点");
}
}
Console.WriteLine($"\n共 {underProductionCount} 台焊枪欠产,请安排维护人员排查。");

运行后,控制台输出所有欠产焊枪的编号和缺口数量,最后一行汇总欠产总台数——这份报告直接可以截图发给班长。
坑1:for 循环边界写错,少跑或多跑一次
❌ for (int i = 1; i <= sensorList.Count; i++) 用下标访问 sensorList[i]
✅ for (int i = 0; i < sensorList.Count; i++) 用下标访问 sensorList[i]
📌 原因:C# 的集合下标从 0 开始,Count 是总数,最后一个元素下标是 Count - 1,写成 <= Count 会越界报错。
坑2:while 循环忘了改条件,直接死循环
❌ while (deviceTemp > 85) { Console.WriteLine("报警"); } // 没有改变 deviceTemp
✅ 循环体内必须有让条件趋向 false 的操作,比如 deviceTemp -= 1.5;
📌 原因:条件永远为 true,程序会卡死,工控机界面直接假死,生产线跟着停。
坑3:foreach 循环里修改集合,直接抛异常
❌ 在 foreach 循环体内对正在遍历的 sensorList 执行 Add() 或 Remove()
✅ 先用 for 循环或 LINQ 找出需要操作的元素,循环结束后再统一修改
📌 原因:foreach 遍历期间集合不允许被修改,C# 运行时会直接抛出 InvalidOperationException。
「学完本节,你掌握了:」
for 用于次数确定的批量操作,while 用于条件驱动的持续监控,do-while 保证至少执行一次的自检场景,foreach 则是遍历设备列表、报警记录等集合数据的首选。四种循环各司其职,对应工厂里四类最常见的重复性任务。理解它们的边界条件和适用场景,是写出稳定工业程序的基本功。
把今天的代码跑一遍,改改阈值数字,感受一下循环的"自动化"——这才是程序比人快的地方。
📖 本文是《C# 工业数字化应用开发专家》系列第 016 节
上一节:【新特性:switch 表达式模式匹配进阶】
下一节:【跳转语句:break、continue、return、goto】(明天更新)
💬 你在工厂里有没有遇到过"批量处理数据"的需求?
是报警记录、设备台账、还是班次产量统计?欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。
🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这420节,从工厂小白到工业软件开发专家,我们一起走。
#C#编程 #工业数字化 #工厂工程师 #编程入门 #dotnet开发
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!