--- title: .NET 开发知识库 tags: - dotNET - CSharp - ASPNET - Microsoft - Backend created: 2026-04-21 --- # .NET 开发知识库 ## .NET 技术栈概述 | 技术 | 说明 | |------|------| | **.NET Framework** | 旧版 Windows 专用(4.8 已停止更新) | | **.NET Core** | 跨平台版本,已合并入 .NET 5+ | | **.NET 5/6/7/8** | 统一跨平台版本,推荐使用 | | **ASP.NET Core** | Web API / MVC 框架 | | **Blazor** | 使用 C# 的 WebAssembly 框架 | | **MAUI** | 跨平台移动应用框架 | | **EF Core** | 轻量级 ORM | ## C# 核心语法 ### 基础类型 ```csharp // 值类型 int num = 42; double price = 19.99; decimal money = 99.99m; bool isActive = true; char grade = 'A'; DateTime now = DateTime.Now; // 引用类型 string name = "张三"; var list = new List(); // 可空类型 int? nullableNum = null; string? nullableStr = null; // 集合初始化 var nums = new[] { 1, 2, 3, 4, 5 }; var names = new List { "张三", "李四" }; // 字典 var dict = new Dictionary { ["a"] = 1, ["b"] = 2 }; ``` ### 类与接口 ```csharp // 类 public class User { public int Id { get; set; } public string Name { get; set; } // 只读属性 public DateTime CreatedAt { get; } // 构造函数 public User(string name) { Name = name; CreatedAt = DateTime.UtcNow; } // 方法 public string GetDisplayName() => $"用户: {Name}"; } // 接口 public interface IRepository { T GetById(int id); IEnumerable GetAll(); void Add(T entity); void Update(T entity); void Delete(int id); } // 继承 public class UserRepository : IRepository { public User GetById(int id) { /* ... */ return null; } public IEnumerable GetAll() { /* ... */ yield break; } public void Add(User entity) { } public void Update(User entity) { } public void Delete(int id) { } } ``` ### 异步编程 ```csharp // async/await public async Task GetUserAsync(int id) { // 异步等待,不阻塞线程 var data = await _context.Users.FindAsync(id); return data; } // 并行任务 public async Task<(User, Order)> GetUserAndOrderAsync(int userId, int orderId) { var userTask = _userRepo.GetByIdAsync(userId); var orderTask = _orderRepo.GetByIdAsync(orderId); await Task.WhenAll(userTask, orderTask); return (userTask.Result, orderTask.Result); } // IAsyncEnumerable(流式数据) public async IAsyncEnumerable StreamUsersAsync() { await using var conn = new SqlConnection(_connectionString); await using var reader = await conn.ExecuteReaderAsync("SELECT * FROM Users"); while (await reader.ReadAsync()) { yield return new User { Id = reader.GetInt32(0), Name = reader.GetString(1) }; } } ``` ### LINQ 查询 ```csharp var users = new List { new User { Id = 1, Name = "张三", Age = 25 }, new User { Id = 2, Name = "李四", Age = 30 }, new User { Id = 3, Name = "王五", Age = 25 } }; // 条件查询 var adults = users.Where(u => u.Age >= 18); // 投影 var names = users.Select(u => u.Name); // 排序 var sorted = users.OrderByDescending(u => u.Age).ThenBy(u => u.Name); // 分组 var grouped = users.GroupBy(u => u.Age) .Select(g => new { Age = g.Key, Count = g.Count() }); // 联接 var joined = from u in users join o in orders on u.Id equals o.UserId select new { u.Name, o.OrderNo }; // 聚合 var count = users.Count(); var avgAge = users.Average(u => u.Age); ``` ## ASP.NET Core Web API ### 最小模板 ```csharp var builder = WebApplication.CreateBuilder(args); // 添加服务 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 注册依赖 builder.Services.AddScoped(); var app = builder.Build(); // 中间件管道 if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseAuthorization(); app.MapControllers(); app.Run(); ``` ### Controller 示例 ```csharp [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { private readonly IUserRepository _repo; public UsersController(IUserRepository repo) { _repo = repo; } [HttpGet] public async Task>> GetAll() { var users = await _repo.GetAllAsync(); return Ok(users.Select(u => new UserDto(u))); } [HttpGet("{id}")] public async Task> GetById(int id) { var user = await _repo.GetByIdAsync(id); if (user == null) return NotFound(); return Ok(new UserDto(user)); } [HttpPost] public async Task> Create([FromBody] CreateUserDto dto) { var user = new User { Name = dto.Name, Email = dto.Email }; await _repo.AddAsync(user); return CreatedAtAction(nameof(GetById), new { id = user.Id }, new UserDto(user)); } [HttpPut("{id}")] public async Task Update(int id, [FromBody] UpdateUserDto dto) { var user = await _repo.GetByIdAsync(id); if (user == null) return NotFound(); user.Name = dto.Name; user.Email = dto.Email; await _repo.UpdateAsync(user); return NoContent(); } [HttpDelete("{id}")] public async Task Delete(int id) { await _repo.DeleteAsync(id); return NoContent(); } } ``` ## Entity Framework Core ```csharp // DbContext public class AppDbContext : DbContext { public DbSet Users { get; set; } public DbSet Orders { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseNpgsql("Host=localhost;Database=mydb;Username=user;Password=pass"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置 modelBuilder.Entity(entity => { entity.HasKey(u => u.Id); entity.HasIndex(u => u.Email).IsUnique(); entity.Property(u => u.Name).HasMaxLength(50).IsRequired(); }); } } // 使用 using var context = new AppDbContext(); // 添加 context.Users.Add(new User { Name = "张三" }); await context.SaveChangesAsync(); // 查询 var user = await context.Users.FirstOrDefaultAsync(u => u.Id == 1); // 更新 user.Name = "李四"; await context.SaveChangesAsync(); // 删除 context.Users.Remove(user); await context.SaveChangesAsync(); // 原始 SQL var users = await context.Users .FromSqlRaw("SELECT * FROM users WHERE age > {0}", 18) .ToListAsync(); ``` ## 依赖注入 ```csharp // 注册方式 builder.Services.AddScoped(); // 每次请求新实例 builder.Services.AddTransient(); // 每次注入新实例 builder.Services.AddSingleton(); // 全局单例 // 在类中注入 public class UserService { private readonly IUserRepository _userRepo; private readonly IUnitOfWork _unitOfWork; // 构造函数注入(推荐) public UserService(IUserRepository userRepo, IUnitOfWork unitOfWork) { _userRepo = userRepo; _unitOfWork = unitOfWork; } } ``` ## 常用命令 ```bash # 创建项目 dotnet new webapi -n MyApi dotnet new blazor -n MyBlazorApp dotnet new classlib -n MyLibrary # 添加包 dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection # 运行 dotnet run # 构建 dotnet build # 发布 dotnet publish -c Release -o ./publish # 测试 dotnet test # 查看依赖 dotnet list package ```