C#和.NET

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 解决了前代开发技术的痛点,核心优势:

  1. 多设备平台:可运行于服务器、PC、PDA、手机等硬件;
  2. 遵循行业标准:原生支持 XML、HTTP、SOAP、JSON、WSDL 通用通信协议;
  3. 安全沙箱:对来源不可信的代码提供安全执行隔离。

.NET Framework 三大核心组成

  1. CLR 公共语言运行时(执行环境) 管控程序全生命周期运行:内存管理与垃圾回收、代码安全校验、线程调度、异常处理。
  2. 开发工具集 集成开发环境、多语言.NET 编译器(C#/VB.NET/F#等)、调试器、ASP.NET/WCF Web 后端技术。
  3. BCL 基础类库(又称 FCL 框架类库) 海量内置通用类,开发者可直接调用。

.NET 相比传统 Windows 开发的升级亮点

统一面向对象体系

CLR、BCL、C# 深度集成,提供统一 OOP 模型,桌面 / 移动端 / Web / 分布式程序共用一套开发范式,跨设备语法逻辑一致。

自动垃圾回收 GC

CLR 内置垃圾回收器,自动释放不再使用的对象内存;开发者无需手动释放内存、排查内存泄漏,大幅降低运维难度。

多维度互操作性
  1. 跨.NET 语言互通:不同.NET 语言编写的类可互相调用、继承,平台不绑定单一编程语言;
  2. P/Invoke 平台调用:直接调用原生 Win32 C 语言 DLL 接口;
  3. COM 兼容:.NET 组件与传统 COM 组件可双向调用。

简化部署:无注册表依赖,最简场景直接复制文件即可运行程序;

并行程序集:同一设备可共存不同版本 DLL,每个程序绑定自身编译对应的库版本,解决 DLL 版本冲突。

类型安全校验 CLR(公共语言运行时) 强制校验参数、数据类型,跨语言组件交互也会保障类型安全,杜绝非法内存访问。

完善的 BCL 基础类库

内置大量通用工具类

  • 文件、字符串、加密安全等基础工具;
  • 列表、字典、哈希表等集合容器;
  • 多线程、同步并发工具;
  • XML 文档读写处理类

通用底层逻辑全部预制,开发者仅编写业务专属逻辑,复用成熟工具减少重复造轮子

.NET程序的流程图,你编写的代码,会编译成中间代码IL,IL可能会调用到BCL提供的库,然后最后交给CLR执行。

C#和.NET的关系

.NET Framework:一套完整开发 & 运行平台,包含两大核心组件

  1. CLR(公共语言运行时):负责代码内存管理、执行、安全校验
  2. BCL(基础类库):海量通用工具代码(文件、网络、UI、并发等)

C#编程语言,专门为.NET 平台设计,用来编写能在 CLR 上运行的代码

除了C#,还有其他的计算机语言也支持.NET。例如F#,VB.NET.

.NET框架的目的是为了跨平台,跨语言。跨平台是不同操作系统,跨语言是不同语言之间开发的东西可以互相访问。

编译为公共中间语言(CIL)

.NET 语言的编译器读取源代码文件,并生成名为程序集(assembly) 的输出文件

程序集分为两种:可执行程序(exe)或动态链接库(DLL)

程序集内部代码并非 CPU 原生机器码,而是一种名为公共中间语言(Common Intermediate Language,CIL) 的中间代码。

一份程序集主要包含以下内容:

  1. 程序的 CIL 指令代码
  2. 程序中所有类型的元数据
  3. 对其他外部程序集引用关系的元数据

中间语言的缩写随.NET 发展发生过变更,不同资料会使用不同名称。例如:中间语言(IL)微软中间语言(MSIL)都表示CIL

编译为原生代码并执行

CIL 不会提前转为原生机器码,仅程序运行时由 CLR 执行 3 步:

  1. 校验程序集安全信息
  2. 分配运行内存
  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 中存在的 WCFWeb FormsWindows Workflow 在现代 .NET 中已经被移除或替代。

在 .NET 中新增了 Span<T>ValueTaskRecords 等现代 API,这些在旧的 .NET Framework 中不可用。

由于.NET Framework是单Windows平台的,.NET是跨平台的,所以在.NET中移除了一些windows独有的库。例如:像 System.Drawing 在 Windows 上可用,但在跨平台 .NET 中被标记为仅 Windows 支持。如果你要在.NET中使用画图库,就不能使用System.Drawing,你可能需要使用一些第三方的库,例如google的SkiaSharp

注意以上是.NET框架,在语言层面,例如C#,几乎没有区别,你写的 C# 代码语法在两者中是一样的。真正的区别:类库和运行时环境,即能用的 API 不完全相同。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注