SharpLab 能查看哪些编译结果?
SharpLab 是一个 C#/VB/F# 编译器在线演练场,你在左侧写代码,右侧可以切换查看不同编译阶段的产物。它最核心的用途不是运行程序,而是观察编译器把你的代码变成了什么——包括 IL、反编译后的 C#、语法树等。适合想理解 C# 语言特性如何被编译器实现、或排查性能与语义问题的开发者。
主要输出类型
SharpLab 的右侧结果面板通常提供以下几类视图(具体名称随版本略有差异):
| 视图 | 内容 | 典型用途 |
|---|---|---|
| IL | 编译后的中间语言指令 | 看编译器实际生成了哪些指令、有没有装箱/闭包/额外分配 |
| C#(反编译) | 由 IL 反编译回的高层 C# 代码 | 看语法糖被展开后的等价写法 |
| JIT Asm | 即时编译后的汇编(需在支持的运行环境下) | 观察运行时优化、内联、寄存器分配 |
| 语法树 / 语法可视化 | 解析阶段的语法结构 | 理解解析器如何组织代码结构 |
| 运行结果 | 程序的标准输出 | 验证代码行为 |
不同语言(C#/VB/F#)可用的视图不完全相同,C# 的支持最完整。
各视图能帮你回答什么问题
IL:编译器到底生成了什么
这是 SharpLab 最常用的视图。例如你写一个 foreach,IL 会显示它被展开成 GetEnumerator/MoveNext 的调用序列;写 async 方法,能看到编译器生成的状态机类型。想确认某段代码是否产生了隐藏的分配或装箱,看 IL 比读文档更直接。
反编译 C#:语法糖的等价形式
IL 反编译回 C# 后,using、lock、yield return、record、模式匹配等语法糖会展开成更基础的写法。这对理解“这个特性本质上做了什么”很有帮助,也常用于对比不同 C# 版本下同一段代码的编译差异。
语法树:解析阶段的结构
语法树视图展示代码在解析后、编译前的结构。当你需要写 Roslyn 分析器、源生成器,或想理解某个语法结构如何被解析时,这个视图比 IL 更贴近源码层面。
JIT Asm:运行时优化
在支持的环境下可以查看 JIT 生成的汇编,用来观察方法是否被内联、边界检查是否被消除等。这一层依赖具体运行时和平台,结果会随环境变化。
使用时的注意点
- 看的是编译产物,不是运行行为:IL 和反编译结果反映编译器输出,不等于程序运行时的实际表现;JIT 层的结果才更接近运行时,但受环境限制。
- 版本相关:C# 语言版本、目标框架会影响输出。同一段代码在不同版本下 IL 可能不同,对比时注意保持版本一致。
- 反编译代码是近似还原:由 IL 反编译回的 C# 不一定能直接编译通过,变量名和结构可能与原意有出入,重点看逻辑而非字面。
- JIT Asm 可用性有限:该视图依赖特定运行环境,并非所有代码或配置下都能看到。
怎么开始
打开 SharpLab 后,在左侧编辑器输入代码,右侧选择想看的视图即可。建议从一个简单例子入手,比如写一个带 foreach 或 async 的方法,然后依次切换 IL 和反编译 C# 视图,对照源码理解编译器做了哪些转换。