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# 视图,对照源码理解编译器做了哪些转换。

sharplab.io
C#/VB/F# compiler playground.