1. C# 开发环境搭建与基础语法解析
对于刚接触 C# 的开发者来说,搭建一个高效的开发环境是首要任务。Visual Studio 作为微软官方推荐的 IDE,提供了最完整的 C# 开发支持。我建议从 Visual Studio 2022 Community 版本开始,这是完全免费的版本,包含了开发中小型项目所需的所有功能。
安装时需要注意几个关键选项:
- 工作负载选择".NET 桌面开发"和"ASP.NET 和 Web 开发"
- 单个组件中确保勾选".NET SDK"和"Git for Windows"
- 语言包选择中文或英文根据个人偏好
安装完成后,可以通过以下步骤验证环境:
- 打开 Visual Studio 创建新项目
- 选择"控制台应用(.NET Core)"模板
- 在 Program.cs 中输入基础代码并运行
提示:首次运行可能会提示安装额外的组件,建议保持网络畅通并允许安装。
1.1 C# 基础语法要点
C# 作为强类型语言,其基础语法结构清晰且富有表达力。以下是一个典型的 Hello World 程序:
csharp复制using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
这段代码展示了几个核心概念:
using指令用于引入命名空间namespace定义了代码的逻辑分组class是面向对象的基本单元Main方法是程序的入口点
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C# 面向对象编程实践
2.1 类与对象的设计原则
在实际开发中,良好的类设计至关重要。以下是一个用户管理系统的示例:
csharp复制public class User
{
// 字段
private string _username;
private DateTime _registrationDate;
// 属性
public string Username
{
get => _username;
set => _username = value ?? throw new ArgumentNullException(nameof(value));
}
public int Age { get; set; }
// 构造函数
public User(string username)
{
Username = username;
_registrationDate = DateTime.Now;
}
// 方法
public string GetGreeting()
{
return $"Hello, {Username}!";
}
}
这个示例展示了:
- 封装:通过属性保护字段
- 构造函数初始化逻辑
- 方法定义和使用
2.2 继承与多态应用
继承是面向对象的核心特性之一。考虑以下员工管理系统:
csharp复制public abstract class Employee
{
public string Name { get; set; }
public abstract decimal CalculateSalary();
}
public class FullTimeEmployee : Employee
{
public decimal MonthlySalary { get; set; }
public override decimal CalculateSalary()
{
return MonthlySalary;
}
}
public class PartTimeEmployee : Employee
{
public decimal HourlyRate { get; set; }
public int HoursWorked { get; set; }
public override decimal CalculateSalary()
{
return HourlyRate * HoursWorked;
}
}
这个设计允许:
- 定义抽象基类规范行为
- 具体子类实现特定逻辑
- 通过多态统一处理不同类型员工
3. C# 高级特性实战
3.1 LINQ 数据查询技术
LINQ (Language Integrated Query) 是 C# 强大的数据查询功能:
csharp复制var products = new List<Product>
{
new Product { ID = 1, Name = "Laptop", Price = 999.99m, Category = "Electronics" },
new Product { ID = 2, Name = "Phone", Price = 699.99m, Category = "Electronics" },
new Product { ID = 3, Name = "Desk", Price = 199.99m, Category = "Furniture" }
};
// 查询语法
var expensiveElectronics =
from p in products
where p.Price > 500 && p.Category == "Electronics"
orderby p.Price descending
select p;
// 方法语法
var sameQuery = products
.Where(p => p.Price > 500 && p.Category == "Electronics")
.OrderByDescending(p => p.Price);
LINQ 的优势包括:
- 统一的查询语法
- 强类型检查
- 延迟执行特性
- 可组合性
3.2 异步编程模式
现代 C# 开发离不开 async/await 模式:
csharp复制public async Task<string> FetchDataAsync(string url)
{
using var client = new HttpClient();
try
{
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求失败: {ex.Message}");
return null;
}
}
关键注意事项:
- 异步方法应返回 Task 或 Task
- 使用 await 而非 .Result 或 .Wait() 避免死锁
- 合理处理异常
- 注意资源释放
4. 常见问题与性能优化
4.1 内存管理最佳实践
虽然 .NET 有垃圾回收机制,但不当的内存使用仍会导致问题:
csharp复制// 不好的实践 - 频繁创建大对象
void ProcessData()
{
for (int i = 0; i < 10000; i++)
{
var buffer = new byte[1024 * 1024]; // 1MB
// 使用buffer...
}
}
// 改进方案 - 重用对象
void ProcessDataOptimized()
{
var buffer = new byte[1024 * 1024]; // 1MB
for (int i = 0; i < 10000; i++)
{
// 重用buffer...
Array.Clear(buffer, 0, buffer.Length);
}
}
其他内存优化技巧:
- 使用对象池模式
- 注意事件订阅导致的引用
- 适时调用 GC.Collect() 进行诊断
- 使用 Memory
和 Span 减少分配
4.2 多线程同步问题
多线程编程需要特别注意同步:
csharp复制public class Counter
{
private int _count = 0;
private readonly object _lock = new object();
public void Increment()
{
lock (_lock)
{
_count++;
}
}
public int GetCount()
{
lock (_lock)
{
return _count;
}
}
}
同步方案选择指南:
- 简单场景使用 lock 语句
- 读多写少考虑 ReaderWriterLockSlim
- 高性能场景尝试 Interlocked 方法
- 避免过度同步影响性能
5. 项目结构与架构设计
5.1 分层架构实现
典型的三层架构示例:
code复制MyProject/
├── MyProject.Domain/ // 领域模型
├── MyProject.Application/ // 业务逻辑
├── MyProject.Infrastructure/ // 基础设施
└── MyProject.Web/ // 表现层
各层职责:
- Domain: 实体、值对象、领域服务
- Application: 用例、DTO、应用服务
- Infrastructure: 持久化、外部服务集成
- Web: 控制器、视图、API端点
5.2 依赖注入配置
现代 .NET 应用广泛使用 DI 容器:
csharp复制// 服务注册
services.AddScoped<IUserRepository, UserRepository>();
services.AddTransient<IEmailService, SmtpEmailService>();
services.AddSingleton<ICacheService, MemoryCacheService>();
// 服务使用
public class UserController : Controller
{
private readonly IUserRepository _userRepo;
public UserController(IUserRepository userRepo)
{
_userRepo = userRepo;
}
}
生命周期选择:
- Singleton: 全局单例
- Scoped: 请求范围内单例
- Transient: 每次请求新实例
6. 测试驱动开发实践
6.1 单元测试编写
使用 xUnit 测试框架示例:
csharp复制public class CalculatorTests
{
[Fact]
public void Add_TwoNumbers_ReturnsSum()
{
// Arrange
var calculator = new Calculator();
// Act
var result = calculator.Add(3, 5);
// Assert
Assert.Equal(8, result);
}
[Theory]
[InlineData(1, 1, 2)]
[InlineData(2, 3, 5)]
[InlineData(-1, 1, 0)]
public void Add_VariousInputs_ReturnsCorrectSum(int a, int b, int expected)
{
var calculator = new Calculator();
var actual = calculator.Add(a, b);
Assert.Equal(expected, actual);
}
}
测试要点:
- 遵循 Arrange-Act-Assert 模式
- 测试方法应具有描述性名称
- 使用 Theory 测试多组数据
- 保持测试独立性和可重复性
6.2 集成测试策略
ASP.NET Core 集成测试示例:
csharp复制public class UserControllerTests : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly WebApplicationFactory<Startup> _factory;
public UserControllerTests(WebApplicationFactory<Startup> factory)
{
_factory = factory;
}
[Fact]
public async Task GetUser_ReturnsUserData()
{
// Arrange
var client = _factory.CreateClient();
// Act
var response = await client.GetAsync("/api/users/1");
// Assert
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
var user = JsonSerializer.Deserialize<UserDto>(content);
Assert.NotNull(user);
Assert.Equal(1, user.Id);
}
}
集成测试注意事项:
- 使用内存数据库替代真实数据库
- 模拟外部服务依赖
- 清理测试数据
- 控制测试执行时间
7. 性能调优实战技巧
7.1 基准测试方法
使用 BenchmarkDotNet 进行性能测试:
csharp复制[MemoryDiagnoser]
public class StringConcatenationBenchmark
{
[Params(10, 100, 1000)]
public int Count { get; set; }
[Benchmark]
public string StringConcat()
{
string result = "";
for (int i = 0; i < Count; i++)
{
result += i.ToString();
}
return result;
}
[Benchmark]
public string StringBuilder()
{
var sb = new StringBuilder();
for (int i = 0; i < Count; i++)
{
sb.Append(i);
}
return sb.ToString();
}
}
基准测试要点:
- 明确测试场景和参数
- 关注内存分配和GC压力
- 多次运行取稳定结果
- 在Release模式下测试
7.2 性能优化案例
常见性能瓶颈及解决方案:
-
数据库查询N+1问题:
- 使用Include加载关联数据
- 考虑使用Dapper进行复杂查询
-
集合操作性能:
- 预分配集合容量
- 使用Span减少分配
- 选择合适的数据结构
-
JSON序列化:
- 使用System.Text.Json替代Newtonsoft.Json
- 预编译序列化器
- 使用源生成器减少反射
8. 部署与持续集成
8.1 应用发布配置
ASP.NET Core 发布选项:
xml复制<PropertyGroup>
<PublishSingleFile>true</PublishSingleFile>
<PublishTrimmed>true</PublishTrimmed>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
发布命令:
bash复制dotnet publish -c Release -r win-x64 --self-contained true
发布策略选择:
- 框架依赖 vs 自包含
- 单文件发布
- 剪裁未使用代码
- 选择目标运行时
8.2 CI/CD 流水线配置
GitHub Actions 示例:
yaml复制name: .NET CI
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Test
run: dotnet test --no-build --configuration Release
- name: Publish
run: dotnet publish -c Release -o ./publish
CI/CD 最佳实践:
- 并行化测试执行
- 添加代码质量检查
- 自动化部署审批
- 监控部署健康状态
9. 现代化 C# 特性应用
9.1 记录类型(Records)使用
C# 9.0 引入的记录类型简化了不可变模型:
csharp复制public record Person(string FirstName, string LastName)
{
public string FullName => $"{FirstName} {LastName}";
}
// 使用示例
var person1 = new Person("John", "Doe");
var person2 = person1 with { LastName = "Smith" };
记录类型特点:
- 默认不可变
- 自动实现值相等比较
- 支持非破坏性修改(with表达式)
- 简洁的语法
9.2 模式匹配增强
C# 的模式匹配不断进化:
csharp复制public static decimal CalculateDiscount(object customer)
{
return customer switch
{
PremiumCustomer p => 0.2m,
RegularCustomer { YearsAsCustomer: >=5 } => 0.1m,
RegularCustomer => 0.05m,
_ => 0m
};
}
模式匹配优势:
- 更清晰的业务逻辑表达
- 类型检查和属性匹配结合
- 减少if-else嵌套
- 与switch表达式结合更强大
10. 跨平台开发实践
10.1 .NET MAUI 开发
使用 .NET MAUI 创建跨平台应用:
csharp复制public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private void OnCounterClicked(object sender, EventArgs e)
{
if (count == 1)
CounterBtn.Text = $"Clicked {count} time";
else
CounterBtn.Text = $"Clicked {count} times";
}
}
MAUI 开发要点:
- 共享UI和业务逻辑
- 平台特定实现
- 响应式布局
- 访问本机功能
10.2 Blazor 全栈开发
Blazor 允许使用 C# 构建 Web 应用:
razor复制@page "/counter"
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}
Blazor 优势:
- 前后端统一技术栈
- 丰富的组件生态
- WebAssembly 或服务器端渲染
- 与现有 .NET 库集成
在实际项目中,我发现合理组合这些技术可以显著提高开发效率。例如,使用 Blazor WASM 构建管理后台,.NET MAUI 开发移动应用,共享核心业务逻辑库,这种架构既能保证代码复用,又能针对不同平台提供最佳用户体验。
