注塑车间的工程师小李最近遇到了一个让他抓狂的问题。
他写了一段采集模具温度的循环程序,逻辑很清楚:温度超过阈值就停止采集,触发报警。
代码跑起来,报警灯亮了,但采集循环还在继续转——数据一条条往数据库里写,停不下来。
他盯着屏幕看了二十分钟,才发现:循环里压根没有"出口"。
这就是今天要解决的问题。学完本节,你的循环代码想停就停、想跳就跳,完全掌控。
「上一节我们学了循环语句,掌握了用 for、while、do-while、foreach 让代码反复执行的方法。
今天在这个基础上,我们进一步学习如何在循环执行过程中主动控制流程走向——该停的时候停,该跳的时候跳。」
循环语句解决的是"重复执行"的问题。但工厂程序里,不可能每次都等循环自然跑完。
设备报警要立刻停采集,某个产品检测不合格要跳过,当前任务完成要立刻返回结果——这些都需要主动打断或跳出程序的正常流程。
跳转语句(Jump Statement)就是干这个的。C# 提供了四个:break、continue、return、goto。
break 的作用是立刻终止当前循环或 switch 分支,跳到循环体外面继续执行。
用工厂类比:就像车间里的紧急停机按钮。不管生产线转到哪一步,按下去,立刻停。
csharp// 示例:温度超限,立刻停止采集
for (int i = 0; i < 100; i++)
{
if (deviceTemp > alarmThreshold)
break; // 直接退出整个 for 循环
CollectData();
}
break 只退出最近一层循环。如果你有两层嵌套循环,内层 break 只退出内层,外层还在继续转。这是初学者最常踩的坑,后面避坑部分会专门讲。
continue 不会退出循环,它的作用是跳过本次迭代剩余的代码,直接进入下一次循环。
工厂类比:质检员在流水线上发现一个次品,直接扔掉,不做任何处理,继续检查下一个。流水线没有停,只是这一件品跳过了。
csharp// 示例:跳过不合格产品,只统计合格数量
foreach (var product in productList)
{
if (product.IsDefective)
continue; // 跳过次品,进入下一件
qualifiedCount++;
}
break 和 continue 的区别是初学者必须搞清楚的:
| 语句 | 作用范围 | 循环是否继续 | 工厂类比 |
|---|---|---|---|
break | 退出整个循环 | ❌ 停止 | 紧急停机 |
continue | 跳过本次迭代 | ✅ 继续 | 跳过次品 |
return | 退出当前方法 | ❌ 停止 | 工人下班离岗 |
return 用于终止当前方法的执行,并可以返回一个值给调用者。
它不只是退出循环,而是直接退出整个方法。就像工人完成了分配的任务,直接打卡下班,不等其他人。
csharp// 示例:在设备列表中找到第一台故障设备,立刻返回
Device FindFirstFaultyDevice(List<Device> devices)
{
foreach (var device in devices)
{
if (device.HasFault)
return device; // 找到就立刻返回,后面的设备不再检查
}
return null; // 没找到返回 null
}
「重要原则:return 之后的代码永远不会被执行。如果你在 return 后面写了代码,VS2026 会直接给你标黄警告:Unreachable code detected。」
goto 可以让程序直接跳转到代码中指定的标签位置,是四个跳转语句里最"暴力"的一个。
工厂类比:就像仓库里的传送带直通车,不走正常流程,直接从 A 点传到 D 点。
goto 在 C# 里有合理的使用场景:跳出多层嵌套循环,以及在 switch 中跳转到另一个 case。
csharp// 示例:在多层嵌套中,发现严重故障,直接跳出所有循环
for (int line = 0; line < productionLines; line++)
{
for (int station = 0; station < stations; station++)
{
if (IsCriticalFault(line, station))
goto EmergencyStop; // 跳出所有嵌套循环
}
}
EmergencyStop:
TriggerAlarm(); // 触发报警处理
⚠️ 工程建议:除了跳出多层嵌套循环这个特定场景,平时尽量不要用
goto。滥用goto会让代码逻辑像意大利面条一样绕成一团,维护起来极其痛苦。
Step 1 新建控制台项目
打开 VS2026,选择 文件 > 新建 > 项目,搜索"控制台应用",选择 .NET 10 框架,项目名填入 JumpStatementDemo,点击创建。
VS2026 Copilot 辅助:创建完成后,Copilot 会自动识别 .NET 10 项目模板,并在右侧面板提示可用的 C# 14 新语法特性,直接点击"了解更多"可内联查看文档。
Step 2 输入代码并启用智能补全
在 Program.cs 中输入方法名或注释,Copilot 会自动预测并补全整个方法体。例如输入 // 检测设备温度是否超限,Copilot 会直接补全带 break 的循环结构,按 Tab 键接受建议。
Step 3 使用右键 Copilot 菜单解释代码
选中任意一段跳转语句代码,右键 > Copilot > 解释,Copilot 会在聊天窗口里用中文逐行解释这段代码的执行流程,非常适合初学者验证自己的理解是否正确。
Step 4 运行与调试
按 F5 启动调试,在 break 或 return 语句行按 F9 设置断点,用 F10 单步执行,观察程序实际跳转路径,和你预期的是否一致。
如果你想用 Copilot Chat 直接生成本节代码框架,可以用这个 Prompt:
用 C# 14 写一个控制台程序,模拟工厂生产线质检场景: - 用 for 循环模拟 20 个产品依次检测 - 用 continue 跳过次品(随机生成) - 用 break 在发现严重故障品时停止整条线 - 用 return 封装成一个返回合格品数量的方法 - 变量命名使用工业语义,加中文注释 - 目标框架:.NET 10,C# 14

把这段 Prompt 粘贴到 VS2026 的 Copilot Chat 窗口,30秒内你就能得到一个可直接运行的完整示例。
这段代码模拟了一条冲压车间生产线的质检流程,综合演示了 break、continue、return、goto 四个跳转语句在同一个工业场景中的实际用法。
csharp// ============================================================
// 冲压车间质检系统 - 跳转语句综合演示
// 目标框架:.NET 10 | 语言版本:C# 14
// ============================================================
using System;
using System.Collections.Generic;
// 产品质检结果枚举
enum QualityResult
{
Qualified, // 合格
Defective, // 次品(跳过统计)
CriticalFault // 严重故障(停线)
}
class PressShopInspector
{
// 报警温度阈值(摄氏度)
private const double alarmThreshold = 85.0;
// 模拟随机质检结果
private static readonly Random rng = new Random(42);
// 模拟单个产品的质检结果
static QualityResult InspectProduct(int productId)
{
int roll = rng.Next(100);
if (roll < 10) return QualityResult.CriticalFault; // 10% 概率严重故障
if (roll < 30) return QualityResult.Defective; // 20% 概率次品
return QualityResult.Qualified; // 70% 合格
}
// 核心质检方法:返回本批次合格品数量
static int RunInspectionBatch(int batchSize)
{
int qualifiedCount = 0;
int defectiveCount = 0;
Console.WriteLine($"=== 开始检测,本批次共 {batchSize} 件产品 ===\n");
for (int productionCount = 1; productionCount <= batchSize; productionCount++)
{
QualityResult result = InspectProduct(productionCount);
// 发现严重故障:触发停线,跳出所有循环
if (result == QualityResult.CriticalFault)
{
Console.WriteLine($"⛔ 产品 #{productionCount} 发现严重故障,触发紧急停线!");
goto EmergencyStop;
}
// 发现次品:跳过本件,继续检测下一件
if (result == QualityResult.Defective)
{
defectiveCount++;
Console.WriteLine($"⚠️ 产品 #{productionCount} 次品,已剔除,继续检测...");
continue;
}
// 合格品:计数并记录
qualifiedCount++;
Console.WriteLine($"✅ 产品 #{productionCount} 合格(当前合格数:{qualifiedCount})");
// 模拟设备温度监控:超温立刻停止采集
double deviceTemp = 70.0 + productionCount * 0.8; // 模拟温度逐渐升高
if (deviceTemp > alarmThreshold)
{
Console.WriteLine($"\n🌡️ 设备温度 {deviceTemp:F1}°C 超限(阈值 {alarmThreshold}°C),停止采集!");
break; // 退出 for 循环,不再采集后续数据
}
}
// 正常结束或 break 后到达此处
Console.WriteLine($"\n--- 本批次检测结束 ---");
Console.WriteLine($"合格品:{qualifiedCount} 件 | 次品:{defectiveCount} 件");
// return 直接返回合格品数量
return qualifiedCount;
// goto 跳转标签:紧急停线处理
EmergencyStop:
Console.WriteLine("🚨 紧急停线已触发,通知维修人员!");
Console.WriteLine($"停线前已检测合格品:{qualifiedCount} 件");
return qualifiedCount; // 返回停线前的合格品数量
}
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8; // 支持输出表情符号
// 启动一批 20 件产品的质检任务
int totalQualified = RunInspectionBatch(20);
Console.WriteLine($"\n📊 最终汇报:本次任务合格品共 {totalQualified} 件");
}
}

运行后,你会在控制台看到每件产品的检测结果逐行输出:合格品打 ✅,次品打 ⚠️ 并跳过,温度超限时触发 break 停止采集,若随机触发严重故障则直接 goto 到停线处理逻辑。
整个执行流程清晰可见,四个跳转语句的实际效果一目了然。
场景任务:光伏电站有 50 台逆变器,需要扫描找出第一台功率异常(输出功率低于额定值 80%)的设备,找到就立刻上报,不再扫描剩余设备。
思路拆解:
foreach 遍历逆变器列表return 直接返回该设备编号csharp// 光伏逆变器异常扫描 - .NET 10 / C# 14
using System;
using System.Collections.Generic;
class InverterScanner
{
// 额定功率(kW)
private const double ratedPower = 100.0;
// 异常功率比例阈值(低于此值视为异常)
private const double powerRatioThreshold = 0.80;
// 扫描并返回第一台异常逆变器的编号,无异常返回 -1
static int FindFirstAbnormalInverter(List<double> inverterOutputList)
{
for (int inverterId = 0; inverterId < inverterOutputList.Count; inverterId++)
{
double powerRatio = inverterOutputList[inverterId] / ratedPower;
// 功率比例正常,continue 跳过
if (powerRatio >= powerRatioThreshold)
continue;
// 发现异常:立刻 return,不再扫描后续设备
Console.WriteLine($"⚡ 逆变器 #{inverterId + 1} 功率异常:" +
$"{inverterOutputList[inverterId]:F1} kW({powerRatio:P0})");
return inverterId + 1;
}
return -1; // 全部正常
}
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8; // 支持输出 emoji
// 模拟 50 台逆变器输出(第 23 台模拟故障)
var outputs = new List<double>();
var rng = new Random(7);
for (int i = 0; i < 50; i++)
outputs.Add(i == 22 ? 75.0 : 90.0 + rng.NextDouble() * 10);
int faultyId = FindFirstAbnormalInverter(outputs);
if (faultyId != -1)
Console.WriteLine($"🚨 上报运维中心:逆变器 #{faultyId} 需要检查!");
else
Console.WriteLine("✅ 所有逆变器运行正常");
}
}

运行后控制台会输出第 23 台逆变器的功率异常信息,程序在找到第一台异常设备后立刻停止扫描,不会继续遍历剩余的 27 台设备——这正是 return 提前退出的价值所在。
坑 1:以为 break 能跳出所有嵌套循环
❌ 错误做法:
csharpfor (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
if (j == 5) break; // 只退出内层,外层还在转
✅ 正确做法:用 goto 或布尔标志变量跳出多层循环
csharpbool shouldStop = false;
for (int i = 0; i < 10 && !shouldStop; i++)
for (int j = 0; j < 10; j++)
if (j == 5) { shouldStop = true; break; }
📌 原因:break 只对最近一层的循环或 switch 生效,多层嵌套要另想办法。
坑 2:在 void 方法里用 return 返回了一个值
❌ 错误做法:
csharpvoid CheckAlarm() { return true; } // 编译报错
✅ 正确做法:
csharpvoid CheckAlarm() { return; } // void 方法 return 后面不带值
bool CheckAlarm() { return true; } // 需要返回值就改方法签名
📌 原因:void 方法的 return 只表示"退出方法",不能携带返回值,两者要匹配。
坑 3:continue 写在循环外面
❌ 错误做法:
csharpif (isDefective) continue; // 不在任何循环里,编译报错
✅ 正确做法:continue 必须写在 for、while、foreach 等循环体内部。
📌 原因:continue 的语义是"进入下一次迭代",没有循环就没有"下一次",编译器直接拒绝。
「学完本节,你掌握了:」
break 像紧急停机按钮,能立刻终止当前循环;continue 像流水线上的次品剔除动作,跳过本次、继续下一件;return 是方法级别的"任务完成离场",可以带着结果返回给调用者;goto 是跳出多层嵌套的最直接手段,但要克制使用。四个语句各司其职,组合起来能让你的工业程序流程控制精准、干净、可读。
代码写多了你会发现,真正好用的程序,不只是能跑,而是该停的地方停得干脆。
📖 本文是《C# 工业数字化应用开发专家》系列第 017 节
上一节:【循环语句:for、while、do-while、foreach】
下一节:【数组:一维、多维与交错数组】(明天更新)
💬 你在工作中遇到过类似的需求吗?
欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。
🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这 420 节,从工厂小白到工业软件开发专家,我们一起走。
#C#编程入门 #工业数字化 #工厂自动化 #程序员成长 #制造业数字化转型
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!