C#(读作“C sharp”)是一门通用编程语言,由 Anders Hejlsberg 带领的 Microsoft 团队设计,2002 年首次发布。它是静态类型的(每个变量都有类型,编译器会在程序运行前检查),面向对象的(代码以类来组织),也是托管的(垃圾回收器会帮你释放内存)。现代 C# 还大量借鉴了函数式编程:lambda、LINQ 查询、模式匹配以及不可变的 record。
下面是一个完整的 C# 程序。点击“运行”:
输出:
Hello, Ada! It is 2026.
C# 能用来做什么
C# 是一门通用语言,所以几乎各种软件里都能见到它,不过大部分用途集中在以下几个领域:
- 游戏。 Unity 是使用最广泛的游戏引擎之一,它用 C# 编写脚本。Godot 也支持 C#。
- Web 后端。 ASP.NET Core 是 .NET 的 Web 框架,用于开发 API、网站和实时应用。在公开的基准测试中,它是最快的主流 Web 框架之一。
- 桌面应用。 Windows 上有 WPF 和 Windows Forms,跨平台则有 .NET MAUI 和 Avalonia。
- 云和服务。 Azure Functions、后台任务、运行在容器中的微服务。
- 工具和自动化。 命令行工具、构建脚本、数据处理。
它在使用 Microsoft 技术的企业和游戏工作室中尤其常见。用 .NET MAUI(Xamarin 的继任者)也可以开发移动应用,但这个方向比 Kotlin 或 Swift 小众得多。
C# 和 .NET 不是一回事
C# 是语言。.NET 是运行它的平台,由三部分组成:
- 运行时(CLR)。 C# 编译器并不生成机器码,而是生成中间语言(IL),存放在
.dll或.exe文件中。程序运行时,公共语言运行时(Common Language Runtime)会把 IL 即时编译(JIT)为本机代码,用垃圾回收器管理内存,并保证类型安全。 - 基础类库。 集合、文件访问、网络、文本、日期、多线程:
System.*下的一切。 - SDK。 也就是
dotnet命令,用来创建、构建、测试和运行项目。
其他语言(F#、Visual Basic)也编译成同样的 IL,所以 C# 程序可以使用用 F# 编写的库。
这个平台有两代。.NET Framework(从 2002 年的 1.0 到 4.8.1)只支持 Windows,至今仍在运行许多老应用。.NET(第 5 版之前叫 .NET Core)是它开源、跨平台的继任者,可以在 Windows、Linux 和 macOS 上运行。新项目都以 .NET 为目标;偶数版本(如 .NET 8 和 .NET 10)提供三年的长期支持。
C# 程序的结构
C# 程序由类型(类、结构体、接口、枚举、record)组成,类型中包含成员(字段、属性、方法)。程序从名为 Main 的静态方法开始执行。命名空间把相关的类型归为一组,using 指令让你可以用简短的名字引用它们。
输出:
Maya: 21.00
Leo: 13.00
从这里已经能看出几点:Order 是一个类,有两个属性(Customer、Total)、一个构造函数和一个方法。decimal 是表示金额的类型,后缀 m 表示一个 decimal 字面量。var 让编译器推断局部变量的类型,List<Order> 是一个只接受 Order 对象的泛型集合。$"..." 里的 {order.Total:F2} 把数字格式化为保留两位小数。
在真实项目中,每个类通常放在单独的文件里,这些文件一起编译成一个程序集。详见类和对象。
静态类型的实际作用
编译器知道每个表达式的类型,所以一大类错误根本不会进入运行中的程序。把字符串赋给 int、调用一个不存在的方法、或者把参数顺序传错,都会在编译时失败,并给出指向出错行的错误。
输出:
29.97
45
类型也驱动着编辑器:在 C# 中,自动补全、重命名和“查找所有引用”都是精确的,因为这些工具读取的类型信息和编译器读取的完全一样。
C# 各版本及其新增特性
自 2020 年的 C# 9 起,每年 11 月都会随新的 .NET 一起发布一个新版本;在那之前,每两到三年才发布一个版本。每个版本都力求让已有代码继续编译通过,少数例外(比如 C# 14 中 field 在属性访问器内变成了关键字)会作为破坏性变更记录在文档中,所以为 C# 2 编写的程序如今几乎都能原样编译。
| 版本 | 年份 | 主要新增特性 |
|---|---|---|
| C# 2 | 2005 | 泛型、可空值类型(int?)、迭代器(yield) |
| C# 3 | 2007 | LINQ、lambda 表达式、var、对象初始化器、扩展方法 |
| C# 4 | 2010 | dynamic、可选参数和命名参数 |
| C# 5 | 2012 | async 和 await |
| C# 6 | 2015 | 字符串插值 $"..."、nameof、空条件运算符 ?. |
| C# 7 | 2017 | 元组、out var、使用 is 的模式匹配、数字分隔符 |
| C# 8 | 2019 | 可空引用类型、switch 表达式、范围 s[1..4]、??=、异步流 |
| C# 9 | 2020 | record、init 访问器、顶级语句、目标类型 new() |
| C# 10 | 2021 | 全局 using、文件范围的命名空间、record struct |
| C# 11 | 2022 | 原始字符串字面量 """、required 成员、列表模式 |
| C# 12 | 2023 | 类的主构造函数、集合表达式 [1, 2, 3] |
| C# 13 | 2024 | params 集合、System.Threading.Lock 类型 |
| C# 14 | 2025 | 扩展成员、属性中的 field 关键字 |
新版本主要是在减少样板代码。下面这个 C# 9 及以上的程序使用了顶级语句(没有 class Program,也没有 Main)、一个 record 和一个 switch 表达式:
// C# 9 and later, in a .NET 6+ project (implicit usings import System)
var order = new Order("Maya", 21.00m);
Console.WriteLine(Shipping(order));
static string Shipping(Order o) => o.Total switch
{
>= 50m => "free shipping",
>= 20m => "standard shipping",
_ => "shipping fee applies"
};
record Order(string Customer, decimal Total);
同样的逻辑用较老的显式写法来写,可以在 C# 6 及之后的所有版本上编译:
输出:
standard shipping
两种写法都是合法的 C#。在已有代码、教程和 Unity 项目中,你会遇到较老的显式写法;在新的 .NET 项目中,则会看到更简短的写法。
LINQ:在语言中直接查询数据
LINQ(语言集成查询,C# 3)是人们解释自己为什么喜欢 C# 时常提到的特性之一。它让你用一串方法调用对任何集合进行筛选、排序、分组和转换:
输出:
95, 91, 88, 72
Average: 78.0
Best: 95
同样的语法可以用在内存中的列表上,也可以通过 Entity Framework 用在数据库表上,还可以用在 XML 上。更多内容见 LINQ。
C# 适合作为第一门语言吗?
C# 一开始对你的要求比 Python 多:你要声明类型,用分号结束语句,还要把代码放进类里。作为回报,编译器能尽早发现错误,开发工具(Visual Studio、VS Code、Rider)非常出色,而且这些概念可以直接迁移到 Java、TypeScript、Kotlin 和 C++。如果你想做 Unity 游戏,或者在使用 .NET 的公司工作,C# 是显而易见的选择。如果你的目标是数据分析或机器学习,Python 的生态更大。
开始学习时,可以安装 .NET SDK 并运行 dotnet new console,或者从 Hello World 开始,直接在这些页面上运行示例。
常见问题
C# 是什么?
C#(读作“C sharp”)是一门静态类型、面向对象的通用编程语言,由 Microsoft 创建,2002 年首次发布。它的源代码会编译成一种中间语言,再由 .NET 运行时转换为机器码,内存由垃圾回收管理。它被用于 Web 后端、Unity 游戏、桌面应用、云服务和各种工具。
C# 和 .NET 是一回事吗?
不是。C# 是语言,.NET 是它运行的平台:包括运行时(CLR)、基础类库(System.Collections.Generic、System.IO 等)以及 SDK 工具。F# 和 Visual Basic 也运行在 .NET 上,而且 C# 的新版本通常和 .NET 的新版本一起发布(例如 C# 12 随 .NET 8 发布)。
C# 能用来做什么?
用 ASP.NET Core 开发 Web API 和网站,用 Unity 开发游戏(它的脚本语言就是 C#),用 WPF 和 WinForms 开发 Windows 桌面应用,用 .NET MAUI 开发跨平台应用,还有云服务、Azure Functions 和命令行工具。它在企业软件和游戏工作室中很常见。
C# 难学吗?
作为第一门语言,它的难度适中。它的语法是 C 风格的,比 Python 更严格,因为每个变量都有编译器会检查的类型;但内存会自动帮你管理,错误信息也很清晰。大多数初学者练习几周后就能写出有用的控制台程序。
现在还值得学 C# 吗?
值得。在开发者调查中,C# 一直位居最常用的语言之列,.NET 是开源且跨平台的,而且这门语言每年 11 月都会发布新版本。如果你想用 Unity 做游戏,或者想进入基于 Microsoft 技术栈的公司工作,C# 是很实际的选择。