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<t></t>、
HttpClient、甚至
Span<t></t>,全来自
.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版本: 在
<targetframework>net6.0</targetframework>下,即使装了最新 VS,
C# 12新语法也会报错:“Feature is not available in C# 10” 反过来,
.NET 8默认启用
C# 12,但如果你手动在
.csproj里加
<langversion>11</langversion>,新语法就失效 更隐蔽的坑:
async方法返回
IAsyncEnumerable<t></t>在
.NET Core 3.0+才有完整支持;在
netcoreapp2.2下编译通过,运行时却抛
MissingMethodException
最常被忽略的一点:
C#的语法糖(如
using声明、
??=)由编译器展开成基础 IL,但它的底层行为是否可靠,仍取决于
.NET运行时有没有正确实现对应契约——比如
ValueTask<t></t>的同步完成路径,在
.NET Core 2.1和
.NET 5之间就有细微差异,影响高并发下的对象复用逻辑。
