C# 是编程语言,.NET 是其运行时环境;C# 编译为 IL,依赖 CLR 执行并提供 BCL、GC、JIT 等能力;.NET Core/.NET 实现跨平台,而 C# 语法版本需与目标 .NET 版本匹配。

C# 是语言,.NET Core(现为统一 .NET 平台)是它运行的“操作系统级”环境。你写 C# 代码,但真正管内存、调 JIT、加载类库、处理跨平台 ABI 的,是 .NET 的运行时——不是 C# 自己干的。
为什么不能只装 C# 编译器就跑程序?
C# 源码编译后生成的是中间语言 IL(不是机器码),必须靠 CLR(Common Language Runtime)在运行时把它转成当前 CPU 能执行的指令。这个 CLR 是 .NET 的一部分,不是 C# 自带的。
-
csc.exe(C# 编译器)只负责把.cs变成.dll或.exe(含 IL),它不提供Console.WriteLine的实现,也不管线程调度或 GC - 你调用的
System.Collections.Generic.List、HttpClient、甚至Span,全来自.NET提供的BCL(Base Class Library) - 换言之:没有
.NET,C#代码连Console都找不到——它只是语法正确,但根本无法链接和运行
.NET Core 不是“另一个 .NET”,而是 C# 跨平台的唯一现代载体
老式 .NET Framework 锁死 Windows,连 Directory.GetFiles 在 Linux 上都会抛 PlatformNotSupportedException。而 .NET Core(从 .NET 5 开始已统一为 .NET)重写了整个底层,包括:
- 跨平台的
System.IO实现(比如用epoll做 Linux 文件监听,而不是 Windows 的ReadDirectoryChangesW) - 独立于 Windows 注册表的配置系统(
IConfiguration默认走 JSON + 环境变量) - 自包含部署模式:
dotnet publish -r linux-x64 --self-contained true打出的包自带运行时,不依赖目标机装 .NET
这意味着:你用 C# 写的 Web API,只要没硬写 RegistryKey 或 WMI,就能直接 dotnet run 在 macOS 或 Ubuntu 上——不是“理论上可行”,是默认就支持。
常见踩坑:以为 C# 版本 = .NET 版本
C# 12 支持 primary constructors 和 alias any,但它能不能用,取决于你项目面向的 .NET 版本:
- 在
下,即使装了最新 VS,net6.0 C# 12新语法也会报错:“Feature is not available in C# 10” - 反过来,
.NET 8默认启用C# 12,但如果你手动在.csproj里加,新语法就失效11 - 更隐蔽的坑:
async方法返回IAsyncEnumerable在.NET Core 3.0+才有完整支持;在netcoreapp2.2下编译通过,运行时却抛MissingMethodException
最常被忽略的一点:C# 的语法糖(如 using 声明、??=)由编译器展开成基础 IL,但它的底层行为是否可靠,仍取决于 .NET 运行时有没有正确实现对应契约——比如 ValueTask 的同步完成路径,在 .NET Core 2.1 和 .NET 5 之间就有细微差异,影响高并发下的对象复用逻辑。










