if适用于范围判断、布尔组合等非等值场景,switch(尤其c# 8+模式匹配)适合多分支等值判断;应优先用switch表达式、守卫子句和显式字符串比较。

if 和 switch 不是“选一个学”,而是解决不同问题的工具:简单二选一用 if,多分支等值判断优先用 switch(尤其 C# 8+ 的模式匹配让 switch 更强)。
什么时候该用 if,而不是 switch
当条件涉及范围、不等式、布尔表达式组合,或逻辑本身不是“等于某个固定值”时,if 是唯一合理选择。
if (age >= 18 && age —— <code>switch无法直接表达范围-
if (user.Role == "admin" || user.HasPermission("edit"))—— 混合属性与方法调用,switch不适用 -
if (str?.Length > 0)—— 可空引用 + 属性访问,switch表达笨重且易出错
强行把这类逻辑塞进 switch 会写出大量 when 分支或嵌套 if,反而降低可读性。
C# 8+ 中 switch 的正确打开方式
别再只写 switch (x) { case 1: ... case 2: ... }。C# 8 引入了 switch 表达式和模式匹配,这才是现代写法。
- 用
switch表达式替代语句:返回值更清晰,无break忘写风险var result = value switch { 1 => "one", 2 => "two", _ => "unknown" }; - 用类型模式处理多态:
obj switch { string s => s.Length, int i => i * 2, _ => 0 } - 用属性模式解构对象:
person switch { { Age: >= 18, Name: var n } => $"Adult: {n}", _ => "Other" }
注意:旧式 switch 语句(带 case 和 break)仍可用,但容易漏 break 导致意外贯穿(fall-through),而表达式天然避免这个问题。
if 嵌套太深?先想能不能提前返回
深层嵌套往往不是语法问题,而是控制流设计问题。C# 支持在方法任意位置 return,这是简化逻辑的关键。
- 错误示范(4 层缩进):
if (user != null) { if (user.IsActive) { if (user.Role == "editor") { ... } } } - 推荐写法(扁平化):
if (user == null) return;<br>if (!user.IsActive) return;<br>if (user.Role != "editor") return;<br>// 正常逻辑在这里,缩进为 0
这种“守卫子句(guard clauses)”写法比嵌套更易读、更易测试,也更容易加日志或监控点。
容易被忽略的细节:字符串比较和 switch 的默认行为
C# 的 switch 对字符串默认使用序号比较(case-sensitive, culture-invariant),但很多人误以为它自动做 StringComparison.OrdinalIgnoreCase。
- 这个会匹配失败:
string s = "HELLO";<br>switch (s) { case "hello": ... }—— 因为大小写敏感 - 想忽略大小写?不能靠
switch自身,得预处理:switch (s.ToUpperInvariant()) { case "HELLO": ... }或改用if+Equals(..., StringComparison.OrdinalIgnoreCase) -
if同样要注意:s == "hello"是引用/值比较,s.Equals("hello", StringComparison.OrdinalIgnoreCase)才安全
类型推断、空值、文化敏感性——这些不是“高级技巧”,而是日常写条件时立刻会撞上的墙。











