c# switch 表达式新用法


switch表达式是返回值的表达式,必须全覆盖分支、不支持fall-through,适用于枚举、字面量及模式匹配;常见错误CS8509因未处理所有可能值;string映射需兜底,is模式支持类型解构与守卫条件;性能优于if-else但受分支数量和守卫影响。

switch 表达式不是 switch 语句

很多人看到 switch 就默认是带 casebreak 的语句块,但 C# 8 起的 switch 表达式本质是「返回值」,必须有返回值、不能漏掉分支、不支持 fall-through。它更像一个增强版三元运算符,适合做值映射或状态转换。

常见错误现象:CS8509: The switch expression does not handle all possible values,说明你没覆盖所有输入可能(比如没写 _ => ... 或类型存在不可穷举值)。

  • 只能用于可穷举场景:枚举、常量字面量、模式匹配支持的类型(如 intstring、自定义类型配合 is 模式)
  • 不支持 goto case 或空 case,每个分支必须用 => 返回一个值
  • 分支顺序重要:匹配从上到下,第一个成功模式胜出(所以具体值要放在通配模式 _ 前面)

string 到 int 的安全映射(避免 TryParse 冗余)

传统做法常要先 if 判断再 int.TryParse,而 switch 表达式能直接把字符串字面量映射为整数,并天然处理未知值。

string input = "two";
int result = input switch
{
    "one" => 1,
    "two" => 2,
    "three" => 3,
    _ => -1 // 必须有兜底,否则编译失败
};

注意:"one" 是字面量匹配,不是正则或子串查找;如果需要模糊匹配(如前缀判断),得换用 is 模式 + 类型解构,而不是纯字面量 switch

用 is 模式匹配处理多类型对象

当输入是 object 或基类,且需按实际运行时类型分支处理时,switch 表达式比嵌套 if (x is T t) 更清晰。

object value = 42.5;
string description = value switch
{
    int i => $"整数: {i}",
    double d when d > 100 => $"大浮点: {d}",
    double d => $"普通浮点: {d}",
    string s when s.Length > 5 => $"长字符串: {s}",
    string s => $"短字符串: {s}",
    null => "空值",
    _ => "未知类型"
};

关键点:

  • when 子句可加守卫条件,但每个分支仍需返回同类型值(这里全是 string
  • null 是独立分支,不被 _ 捕获(C# 9+ 中 _ 不匹配 null,除非显式写 null
  • 类型模式(如 int i)会自动解构并引入变量 i,后续表达式可直接用

性能与编译器生成代码的关系

switch 表达式在多数情况下会被编译为跳转表(switch IL 指令)或二分查找,比一连串 if-else 快,但前提是分支是常量且数量较多(一般 ≥5)。若只有 2–3 个分支,JIT 往往优化成条件移动指令,和三元差不多。

容易被忽略的地方:

  • 字符串 switch 在 .NET 5+ 默认启用哈希跳转优化,但若分支含 when 守卫,就退化为顺序判断
  • 泛型方法里用 switch 表达式时,若类型参数未约束为可穷举,编译器无法验证全覆盖,强制要求 _ 分支
  • 不要在 switch 表达式里调用副作用方法(如 Log()),因为分支执行顺序不保证——只保证第一个匹配分支被执行


# go  # switch  # c#  # .net  # String  # Object  # NULL  # 常量  # 运算符  # 三元运算符  # if  # break  # goto  # 字符串  # int  # 泛型  # 对象  # 穷举  # 不支持  # 第一个  # 浮点  # 返回值  # 跳转  # 子句  # 放在  # 很多人  # 适用于 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 如何在 Go 中正确测试带 Cookie 的 HTTP 请求  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  如何使用Golang理解结构体指针方法接收者_Golang修改字段实践  Win10怎么卸载剪映_Win10彻底卸载剪映方法【步骤】  MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】  Python迭代器生成器进阶教程_节省内存与懒加载实战  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  c++ atoi和atof函数用法_c++字符数组转数字  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  Win11怎么关闭任务栏小图标_Windows11任务栏角溢出设置  PythonPandas数据分析教程_数据清洗与处理技巧  Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】  php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】  php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】  如何诊断并终止卡死的 multiprocessing 子进程  C#如何使用Channel C#通道实现异步通信  Windows10电脑怎么设置自动连接WiFi_Win10无线网络属性勾选  Win11怎么格式化U盘_Win11系统U盘格式化与文件系统选择【教程】  php怎么下载安装后设置错误日志_phpini log配置教程【汇总】  win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】  Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件  php删除数据怎么加限制_带where条件删除避免全删【指南】  Python函数接口文档化_自动化说明【指导】  mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】  Go 中的 := 运算符:类型推导机制与使用边界详解  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】  VSC怎么快速定位PHP错误行_错误追踪设置法【方法】  Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置  Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查  Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠  Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】  Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改  Win10如何更改任务栏高度_Windows10解锁任务栏调整大小  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】  Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】  Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Win11如何设置电源计划_Win11电源计划优化教程【攻略】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在 Go 中判断变量是否为函数类型  如何在 Windows 11 中使用 AlomWare 工具箱  PhpStorm怎么调试PHP代码_PhpStorm断点设置与调试启动步骤【指南】  Python异步编程高级项目教程_asyncio协程任务管理实战  Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】  如何使用Golang模拟请求超时_Golang context与HTTP请求测试实践  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  用Python构建微服务架构实践_FastAPI与Django对比详解  Windows10如何重置此电脑_Windows10电脑重置方法【步骤】 

 2025-12-29

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.