C# 概述与环境配置
C# 语言概述、.NET 生态、.NET 8/9 新特性、环境搭建与 Hello World
1. C# 语言概述
C#(读作 “C Sharp”)是由微软在 2000 年发布的现代、面向对象、类型安全的编程语言。它由 Anders Hejlsberg 领导设计,最初作为 .NET 战略的核心语言推出。C# 融合了 C/C++ 的强大能力和 Java 的简洁优雅,同时不断引入函数式编程、异步编程等现代范式。
1.1 核心特点
| 特点 | 描述 | 优势 |
|---|---|---|
| 类型安全 | 强类型系统,编译期检查类型兼容性 | 减少运行时错误,提高代码可靠性 |
| 面向对象 | 完整支持封装、继承、多态 | 代码复用性强,结构清晰 |
| 跨平台 | 基于 .NET 运行于 Windows/Linux/macOS | 一次编写,多处运行 |
| 垃圾回收 | 自动内存管理,无需手动释放 | 减少内存泄漏风险 |
| 异步优先 | async/await 原生语言级支持 | 简化异步编程模型 |
| 多范式 | 支持面向对象、函数式、泛型编程 | 灵活应对不同场景 |
| 持续演进 | 每年一个版本,快速迭代 | 始终保持语言现代化 |
1.2 C# 版本演进
| 版本 | 发布年份 | 对应 .NET | 主要特性 |
|---|---|---|---|
| C# 1.0 | 2002 | .NET 1.0 | 基础面向对象、委托、事件 |
| C# 2.0 | 2005 | .NET 2.0 | 泛型、匿名方法、可空类型、迭代器 |
| C# 3.0 | 2007 | .NET 3.5 | LINQ、Lambda 表达式、扩展方法、自动属性 |
| C# 4.0 | 2010 | .NET 4.0 | dynamic、命名参数、协变逆变 |
| C# 5.0 | 2012 | .NET 4.5 | async/await、调用方信息 |
| C# 6.0 | 2015 | .NET 4.6 | 字符串插值、空条件运算符、表达式体成员 |
| C# 7.x | 2017-2018 | .NET Core 2.x | 模式匹配、元组、本地函数、ref return |
| C# 8.0 | 2019 | .NET Core 3.1 | 可空引用类型、异步流、范围与索引 |
| C# 9.0 | 2020 | .NET 5 | 顶级语句、记录类型、init 访问器、模式匹配增强 |
| C# 10 | 2021 | .NET 6 | 全局 using、文件范围命名空间、常量字符串插值 |
| C# 11 | 2022 | .NET 7 | 原始字符串字面量、列表模式、required 修饰符 |
| C# 12 | 2023 | .NET 8 | 主构造函数、集合表达式、内联数组 |
| C# 13 | 2024 | .NET 9 | params 集合、扩展类型、lock 对象、partial 属性 |
2. .NET 生态系统
2.1 .NET 架构概览
┌─────────────────────────────────────────────────┐
│ 应用层 (Apps) │
│ ASP.NET Core │ MAUI │ Blazor │ 游戏 │ 微服务 │
├─────────────────────────────────────────────────┤
│ BCL (基础类库) │
│ 集合 │ IO │ 网络 │ LINQ │ 并行 │ 诊断 │
├─────────────────────────────────────────────────┤
│ .NET Runtime │
│ CLR/CoreCLR │ GC │ JIT │ 类型系统 │ 线程池 │
├─────────────────────────────────────────────────┤
│ 操作系统 / 容器 │
│ Windows │ Linux │ macOS │ Docker │ K8s │
└─────────────────────────────────────────────────┘
2.2 .NET 8 新特性
- 性能提升:JIT 编译优化、动态 PGO(Profile-Guided Optimization)默认启用
- Native AOT 增强:更小的二进制体积、更好的反射支持
- ASP.NET Core:Blazor SSR、新的身份认证 API
- EF Core:复杂类型(Complex Types)、原始 SQL 查询增强
- 新的数值类型:
Int128、UInt128
// C# 12 主构造函数
public class ProductService(ILogger logger, IRepository repo)
{
public Product GetProduct(int id)
{
logger.LogInformation("获取产品: {Id}", id);
return repo.GetById<Product>(id);
}
}
// C# 12 集合表达式
int[] numbers = [1, 2, 3, 4, 5];
List<string> names = ["Alice", "Bob", "Charlie"];
int[] combined = [..numbers, 6, 7, 8]; // 展开并合并
2.3 .NET 9 新特性
- 性能飞跃:Server GC 优化、新的 SIMD 加速
- ASP.NET Core:内置 OpenAPI 支持、静态资产优化
- LINQ 增强:
CountBy、AggregateBy、Index方法 - 新的
lock语义:System.Threading.Lock对象替代Monitor
// .NET 9 LINQ 新方法
var counts = words.CountBy(w => w.Length);
// 结果: [{ Key: 3, Value: 5 }, { Key: 5, Value: 3 }, ...]
var aggregated = orders.AggregateBy(
keySelector: o => o.CustomerId,
seed: 0m,
func: (sum, order) => sum + order.Amount);
// C# 13 新的 lock 对象
Lock lockObj = new();
using (lockObj.EnterScope())
{
// 线程安全操作
}
3. 开发环境搭建
3.1 安装 .NET SDK
# Windows - 使用 winget
winget install Microsoft.DotNet.SDK.9
# macOS - 使用 Homebrew
brew install dotnet-sdk
# Linux (Ubuntu)
sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0
# 验证安装
dotnet --version
dotnet --list-sdks
3.2 Visual Studio 2022
Visual Studio 是 Windows 平台上最强大的 C# 开发 IDE:
- Community 版:免费,适合个人开发者和开源项目
- Professional 版:适合小型团队,含企业级工具
- Enterprise 版:完整功能,含代码分析和负载测试
推荐工作负载:
- ASP.NET 和 Web 开发
- .NET 桌面开发
- Azure 开发
- 游戏开发(Unity 工作负载)
3.3 Visual Studio Code
轻量级跨平台方案,适合日常开发:
# 安装 C# Dev Kit 扩展
# 扩展 ID: ms-dotnettools.csdevkit
# 常用配套扩展
# - C# (OmniSharp): 语言服务
# - NuGet Package Manager: 包管理
# - REST Client: API 测试
VS Code 配置(.vscode/settings.json):
{
"csharp.experimental.debug.hotReload": true,
"omnisharp.enableRoslynAnalyzers": true,
"omnisharp.enableEditorConfigSupport": true,
"dotnet.backgroundAnalysis.analyzerDiagnosticsScope": "fullSolution"
}
3.4 JetBrains Rider
跨平台商业 IDE,基于 IntelliJ 平台和 ReSharper 技术:
- 智能代码分析和重构
- 内置数据库工具
- Unity/Unreal 游戏开发支持
- Docker 和 Kubernetes 集成
- 强大的调试和性能分析工具
4. 项目类型与创建
4.1 常用项目模板
# 控制台应用
dotnet new console -n MyApp
# ASP.NET Core Web API
dotnet new webapi -n MyApi
# ASP.NET Core MVC
dotnet new mvc -n MyWeb
# Blazor Server / WebAssembly
dotnet new blazor -n MyBlazor
# 类库
dotnet new classlib -n MyLib
# Worker Service(后台服务)
dotnet new worker -n MyWorker
# xUnit 测试项目
dotnet new xunit -n MyTests
# MAUI 跨平台应用
dotnet new maui -n MyMauiApp
# 解决方案文件
dotnet new sln -n MySolution
4.2 项目结构
MyApp/
├── MyApp.csproj # 项目文件(SDK 风格)
├── Program.cs # 入口文件
├── appsettings.json # 配置文件
├── GlobalUsings.cs # 全局 using 声明
├── Models/ # 数据模型
├── Services/ # 业务逻辑
└── Controllers/ # 控制器(Web API)
4.3 csproj 文件(SDK 风格)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MyApp</RootNamespace>
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Serilog" Version="4.2.0" />
<PackageReference Include="Polly" Version="8.5.0" />
</ItemGroup>
</Project>
4.4 常用 CLI 命令
# 构建与运行
dotnet build # 构建项目
dotnet run # 运行项目
dotnet run --launch-profile Dev # 指定配置运行
# 包管理
dotnet add package Newtonsoft.Json # 添加 NuGet 包
dotnet add package Serilog --version 4.2.0
dotnet remove package Newtonsoft.Json # 移除包
dotnet list package # 列出包
dotnet list package --outdated # 检查过期包
# 发布
dotnet publish -c Release -o ./publish
dotnet publish -c Release -r linux-x64 --self-contained
dotnet publish -c Release -r win-x64 -p:PublishAot=true # Native AOT
# 其他
dotnet test # 运行测试
dotnet format # 代码格式化
dotnet tool install -g dotnet-ef # 全局工具安装
5. Hello World
5.1 顶级语句(C# 9+)
// Program.cs - 最简形式
Console.WriteLine("Hello, World!");
// 使用变量和表达式
var name = "C# 开发者";
var version = Environment.Version;
Console.WriteLine($"你好, {name}! 当前 .NET 版本: {version}");
// 顶级语句中的方法
int Add(int a, int b) => a + b;
Console.WriteLine($"1 + 2 = {Add(1, 2)}");
// 异步入口
await Task.Delay(100);
Console.WriteLine("异步 Hello World!");
5.2 传统 Main 方法
using System;
namespace MyApp;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
if (args.Length > 0)
{
Console.WriteLine($"参数: {string.Join(", ", args)}");
}
}
}
5.3 ASP.NET Core 最小 API
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello, World!");
app.MapGet("/hello/{name}", (string name) => $"你好, {name}!");
app.Run();
6. .NET 版本选择指南
| 场景 | 推荐 .NET 版本 | 说明 |
|---|---|---|
| 新项目 | .NET 9 (LTS) | 最新长期支持版本 |
| 企业生产 | .NET 8 (LTS) | 稳定的长期支持版本 |
| 维护旧项目 | .NET 6 (LTS) | 旧版长期支持,2026年11月到期 |
| 游戏开发 | .NET Standard 2.1 / .NET 8 | 取决于 Unity 版本 |
| 库开发 | netstandard2.0 或 net8.0 | 最大化兼容性 |
提示:.NET 采用 STS(标准支持,18个月)和 LTS(长期支持,36个月)交替发布策略。.NET 8 和 .NET 9 均为重要版本,新项目建议直接使用 .NET 9。