C#是什么
C# 专为微软.NET Framework 平台设计,C# 读音为 “See Sharp”。
微软需要一套统一、完全面向对象的集成开发框架,消除旧技术弊病,为此着手打造全新代码运行环境 + 开发工具链。
经过20多年的发展,C#已经由原来的只支持Windows系统变成今天的跨多个平台的语言了。
如今 C# 与.NET 已是完整跨平台解决方案,可开发 Windows、macOS、Linux、Android 应用;同时它也是绝大多数云系统的首选运行时
多得微软的大力支持,C#的迭代速度非常快,2022 年推出第 7 版。C# 仍可兼容 20 年前编写的旧代码,但新版语法更简洁优雅、结构更精炼。如今已是第 15 版.(2026年)
C# 版本发展简史(部分)
- C# 1.0(2001):正式公开发布
- C# 2.0(VS2005):泛型、迭代器、匿名方法
- C# 3.0(VS2008):扩展方法、Lambda、LINQ(语言集成查询)
- C# 4.0(2010):命名 / 可选参数、dynamic动态类型、TPL 并行任务库,充分利用多核处理器
- C# 5.0:async/await原生异步任务支持
- C# 6.0:字符串插值、表达式体成员、属性简化写法
- C# 7.0~7.3:元组多返回值、简化out参数、模式匹配、异步Main方法
- C# 8.0/9.0/10.0:记录(不可变引用类型)、顶层语句(无需Main)、默认接口方法、静态局部函数、异步可释放类型、全语言范围模式匹配
- C#11 (.NET7):原始字符串、泛型数学、required 属性
- C#12 (.NET8):主构造函数、集合简写、内联数组
- C#13 (.NET9):分部属性、扩展索引器、迭代器 ref 局部
- C#14 (.NET10):泛型别名、深度集合匹配、SIMD 语法糖
Windows 仍是 C# 核心平台,但依托.NET Runtime,代码可直接在 Linux 等系统运行,实现一次编写多系统部署。
.NET框架
2002 年首发.NET Framework
.NET Framework 解决了前代开发技术的痛点,核心优势:
- 多设备平台:可运行于服务器、PC、PDA、手机等硬件;
- 遵循行业标准:原生支持 XML、HTTP、SOAP、JSON、WSDL 通用通信协议;
- 安全沙箱:对来源不可信的代码提供安全执行隔离。
.NET Framework 三大核心组成
- CLR 公共语言运行时(执行环境) 管控程序全生命周期运行:内存管理与垃圾回收、代码安全校验、线程调度、异常处理。
- 开发工具集 集成开发环境、多语言.NET 编译器(C#/VB.NET/F#等)、调试器、ASP.NET/WCF Web 后端技术。
- BCL 基础类库(又称 FCL 框架类库) 海量内置通用类,开发者可直接调用。
.NET 相比传统 Windows 开发的升级亮点
统一面向对象体系
CLR、BCL、C# 深度集成,提供统一 OOP 模型,桌面 / 移动端 / Web / 分布式程序共用一套开发范式,跨设备语法逻辑一致。
自动垃圾回收 GC
CLR 内置垃圾回收器,自动释放不再使用的对象内存;开发者无需手动释放内存、排查内存泄漏,大幅降低运维难度。
多维度互操作性
- 跨.NET 语言互通:不同.NET 语言编写的类可互相调用、继承,平台不绑定单一编程语言;
- P/Invoke 平台调用:直接调用原生 Win32 C 语言 DLL 接口;
- COM 兼容:.NET 组件与传统 COM 组件可双向调用。
简化部署:无注册表依赖,最简场景直接复制文件即可运行程序;
并行程序集:同一设备可共存不同版本 DLL,每个程序绑定自身编译对应的库版本,解决 DLL 版本冲突。
类型安全校验 CLR(公共语言运行时) 强制校验参数、数据类型,跨语言组件交互也会保障类型安全,杜绝非法内存访问。
完善的 BCL 基础类库
内置大量通用工具类
- 文件、字符串、加密安全等基础工具;
- 列表、字典、哈希表等集合容器;
- 多线程、同步并发工具;
- XML 文档读写处理类
- …
通用底层逻辑全部预制,开发者仅编写业务专属逻辑,复用成熟工具减少重复造轮子

.NET程序的流程图,你编写的代码,会编译成中间代码IL,IL可能会调用到BCL提供的库,然后最后交给CLR执行。
C#和.NET的关系
.NET Framework:一套完整开发 & 运行平台,包含两大核心组件
- CLR(公共语言运行时):负责代码内存管理、执行、安全校验
- BCL(基础类库):海量通用工具代码(文件、网络、UI、并发等)
C#:编程语言,专门为.NET 平台设计,用来编写能在 CLR 上运行的代码
除了C#,还有其他的计算机语言也支持.NET。例如F#,VB.NET.
.NET框架的目的是为了跨平台,跨语言。跨平台是不同操作系统,跨语言是不同语言之间开发的东西可以互相访问。
编译为公共中间语言(CIL)
.NET 语言的编译器读取源代码文件,并生成名为程序集(assembly) 的输出文件
程序集分为两种:可执行程序(exe)或动态链接库(DLL)
程序集内部代码并非 CPU 原生机器码,而是一种名为公共中间语言(Common Intermediate Language,CIL) 的中间代码。
一份程序集主要包含以下内容:
- 程序的 CIL 指令代码
- 程序中所有类型的元数据
- 对其他外部程序集引用关系的元数据
中间语言的缩写随.NET 发展发生过变更,不同资料会使用不同名称。例如:中间语言(IL)、微软中间语言(MSIL)都表示CIL

编译为原生代码并执行
CIL 不会提前转为原生机器码,仅程序运行时由 CLR 执行 3 步:
- 校验程序集安全信息
- 分配运行内存
- 交由 JIT 编译器分段编译为原生代码
JIT 按需编译机制
仅执行到的代码才编译,编译后缓存复用;未调用代码不编译,同段代码只编译一次。
程序集 (CIL + 类型信息) → CLR (JIT 编译器) → 原生代码 → 操作系统服务
CLR 托管职责
CIL 转原生代码后,CLR 自动管理:垃圾内存回收、数组越界检测、参数类型校验、异常处理。
托管和非托管
- 托管代码:.NET 语言代码,依赖 CLR 运行管控
- 非托管代码:不受 CLR 管理,如原生 C/C++ Win32 DLL
现在微软已经有AOT编译了,可以直接把C#代码编译成本机代码,类似C++那样,不需要安装.NET运行时就可以直接运行EXE了
NGen 工具
离线预编译程序集为本机原生镜像,运行时可跳过 JIT 编译,加快启动速度。
.NET Core AOT 为新一代预编译方案,可生成无运行时依赖的独立原生程序
Assembly (Type Info, CIL)
↓
JIT Compiler
↓
Native Code
↓
Operating System Services
无论原始源代码使用何种编程语言,都遵循同一套编译与执行流程
每种语言有每种语言的编译器,VB.NET有VB.NET的编译器。C#有C#的编译器,它们都会把各自的代码编译成CIL,然后CIL都会交给JIT转录成原生代码。然后原生代码交给CPU运行。这就是为什么.NET开发的软件,需要安装.NET环境一样,和JAVA一样,java需要安装JRE.
flowchart TD
subgraph Compile_Time
A[C# Source] --> B[C# Compiler]
B --> C[Assembly CIL]
D[VB Source] --> E[VB Compiler]
E --> C
F[Xyz.NET Source] --> G[Xyz.NET Compiler]
G --> C
end
subgraph Run_Time
C --> H[JIT Compiler]
H --> I[Native Code]
I --> J[Operating System Services]
end
上图各种语言编译和运行的流程图
公共语言运行时(CLR)
.NET Framework 的核心组件是 CLR,它运行在操作系统上层,负责管理程序执行
- 自动垃圾回收(GC)
- 安全校验与身份认证 通过基础类库(BCL)
- 提供丰富编程能力,包含 Web 服务、数据服务等功能
flowchart TD
subgraph Unmanaged_Code
A[Non-.NET Program] --> OS[Operating System]
end
subgraph Managed_Code
B[Assembly] --> CLR[Common Language Runtime]
C[Assembly] --> CLR
D[Assembly] --> CLR
subgraph CLR[Common Language Runtime]
M[Memory Management] --- E[Exception Handling]
G[Garbage Collection] --- R[Reflection Services]
J[JIT Compiler] --- L[Class Loader]
S[Security Services]
end
CLR --> OS
end
公共语言基础架构(CLI)
每种编程语言都内置一套基础原生类型,用于表示整数、浮点数、字符等数据。
公共语言基础架构(CLI) 是一套标准集合,将.NET Framework 所有组件整合为统一、兼容的完整体系。
例如整数占用的二进制位数在所有语言中都统一。
flowchart TD
subgraph CLI[CLI]
CLR[Common Language Runtime] --- CLS[Common Language Specification]
BCL[Base Class Library] --- MDS[Metadata Definition & Semantics]
CTS[Common Type System] --- CIL[Common Intermediate Language]
end
多数开发者无需深究 CLI 完整规范,但必须掌握CTS 通用类型系统与CLS 通用语言规范。
CTS 通用类型系统
- 内置一套规范基础数据类型,每种类型属性固定;
- 各.NET 语言自有类型都会映射到这套标准类型子集;
- 所有类型全部继承自根基类
object; - 统一标准让系统内置类型、用户自定义类型可跨任意.NET 语言互通。
CLS 通用语言规范
定义兼容.NET 的语言必须遵守的统一规则,涵盖:数据类型、类构造、参数传递等跨语言交互约束。
.NET和.NET Framework的区别
.NET 是微软现代的跨平台开发平台,而 .NET Framework 是早期的仅限 Windows 的运行时和库。新功能只会在 .NET 中继续发展,.NET Framework 已进入维护阶段,仅提供安全更新。
.NET是跨平台的。是目前微软主力开发。我们后续主要内容会优先它。
| 特性 | .NET | .NET Framework |
|---|---|---|
| 平台支持 | 跨平台(Windows、Linux、macOS、容器、移动端 via MAUI) | 仅限 Windows |
| 状态 | 持续更新(.NET 5 → .NET 10,年度发布,LTS 支持) | 维护模式(4.8 是最后版本,仅安全补丁) |
| 性能 | 更快启动、更高吞吐量、改进的垃圾回收 | 性能较旧,依赖 Windows API |
| 应用场景 | 新项目:Web API、微服务、云原生、跨平台桌面/移动 | 旧项目:Web Forms、WCF、Windows Workflow 等 |
| 部署 | 支持 Docker、容器化、云环境 | 不支持容器,依赖 Windows Server |
| 语言支持 | C#、F#、VB.NET(跨平台) | C#、VB.NET(Windows) |
.NET 和 .NET Framework 的区别并不大。两者都使用 C#、F#、VB.NET 等语言,核心语法保持一致。你写的 C# 代码在大多数情况下可以同时在 .NET Framework 和 .NET (Core/5/6/7/8…) 上编译运行。
差异主要体现在 类库可用性,而不是语法。
在 .NET Framework 中存在的 WCF、Web Forms、Windows Workflow 在现代 .NET 中已经被移除或替代。
在 .NET 中新增了 Span<T>、ValueTask、Records 等现代 API,这些在旧的 .NET Framework 中不可用。
由于.NET Framework是单Windows平台的,.NET是跨平台的,所以在.NET中移除了一些windows独有的库。例如:像 System.Drawing 在 Windows 上可用,但在跨平台 .NET 中被标记为仅 Windows 支持。如果你要在.NET中使用画图库,就不能使用System.Drawing,你可能需要使用一些第三方的库,例如google的SkiaSharp
注意以上是.NET框架,在语言层面,例如C#,几乎没有区别,你写的 C# 代码语法在两者中是一样的。真正的区别:类库和运行时环境,即能用的 API 不完全相同。