共计 2163 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
流程控制是编程中最基础也最重要的概念之一。对于 C# 初学者来说,理解和掌握流程控制是写出高质量代码的第一步。然而在实际开发中,新手经常会遇到一些常见问题,比如:

- 条件判断嵌套过深,代码难以阅读和维护
- 循环结构选择不当,导致性能问题
- 函数职责不单一,一个函数做太多事情
- 缺少必要的异常处理,程序健壮性不足
这些问题不仅会影响代码质量,还会给后续维护带来很大困难。接下来,我们就从基础开始,系统地讲解 C# 中的流程控制和函数调用。
核心概念解析
条件语句选择
C# 提供了多种条件语句,每种都有其适用场景:
if/else:适合简单的二元判断switch:适合多分支情况,特别是枚举类型-
三元运算符(
?:):适合简单的值选择 -
if/else语句示例:if(score >= 90) {grade = 'A';} else if(score >= 80) {grade = 'B';} else {grade = 'C';} -
switch语句示例(C# 8.0+ 的模式匹配):var result = userInput switch { "admin" => "管理员", "user" => "普通用户", _ => "未知角色" };
循环结构性能
不同的循环结构在性能上有所差异:
for:适合已知循环次数的场景while:适合条件不确定的场景-
foreach:适合遍历集合,语法简洁 -
循环性能对比示例:
// 使用 for 循环 for(int i = 0; i < list.Count; i++) {// 访问元素通过索引} // 使用 foreach 循环 foreach(var item in list) {// 直接访问元素}
函数参数传递
C# 中的参数传递有两种方式:
- 值类型:传递的是值的副本
-
引用类型:传递的是引用(内存地址)
-
参数传递示例:
// 值类型传递 void ModifyValue(int num) {num = 10;} // 引用类型传递 void ModifyArray(int[] arr) {arr[0] = 10; }
代码示例:差实践 vs 好实践
示例 1:条件判断冗余
差实践:
if(isValid == true)
{if(count > 0)
{// 业务逻辑}
}
好实践:
if(!isValid || count <= 0) return;
// 业务逻辑
示例 2:异常处理不完整
差实践:
try
{File.ReadAllText("file.txt");
}
catch(Exception ex)
{Console.WriteLine("出错啦!");
}
好实践:
try
{var content = File.ReadAllText("file.txt");
// 处理内容
}
catch(FileNotFoundException ex)
{Console.WriteLine($"文件未找到: {ex.FileName}");
}
catch(UnauthorizedAccessException ex)
{Console.WriteLine("无权限访问文件");
}
catch(Exception ex)
{Console.WriteLine($"未知错误: {ex.Message}");
}
finally
{// 清理资源}
示例 3:函数职责不单一
差实践:
void ProcessOrder(Order order)
{
// 验证订单
// 计算价格
// 保存到数据库
// 发送邮件通知
}
好实践:
void ProcessOrder(Order order)
{ValidateOrder(order);
CalculatePrice(order);
SaveOrder(order);
SendNotification(order);
}
性能与安全
循环优化技巧
-
避免在循环内部进行重复计算:
// 差做法 for(int i = 0; i < list.Count; i++) {// ...} // 好做法 int count = list.Count; for(int i = 0; i < count; i++) {// ...} -
使用
Span<T>或Memory<T>减少内存分配
函数调用优化
- 避免过深的递归调用
- 考虑使用尾递归优化(C# 7.0+)
- 合理使用
in、ref、out参数
防御性编程
-
参数校验:
public void ProcessData(string data) {if(string.IsNullOrWhiteSpace(data)) throw new ArgumentException("数据不能为空", nameof(data)); // 处理逻辑 } -
使用
nameof运算符提高可维护性
避坑指南
避免过度嵌套
- 使用卫语句提前返回
- 将深层逻辑提取为独立函数
- 使用策略模式替代复杂条件
- 考虑使用状态机模式
- 合理使用多态
函数设计原则
- 单一职责原则
- 合理控制函数长度(建议不超过一屏)
- 有意义的命名
- 适当的注释
异步编程注意事项
- 避免
async void方法 - 正确处理异常
- 注意上下文捕获
- 使用
ValueTask优化性能
总结与思考
通过本文的学习,你应该已经掌握了 C# 流程控制和函数调用的核心概念。为了进一步巩固知识,建议思考以下问题:
- 如何在复杂业务场景中平衡可读性和性能?
- 函数参数设计时,什么时候应该使用
out参数而不是返回元组? - 在异步编程中,如何处理多个并发任务的异常?
推荐进一步学习资源:
- 官方文档:C# 编程指南
- 书籍:《C# 8.0 和.NET Core 3.0 高级编程》
- 书籍:《Clean Code》(代码整洁之道)
希望这篇指南能帮助你写出更清晰、更健壮的 C# 代码!
正文完
