diff --git a/dotNet知识库/dotnet开发指南.md b/dotNet知识库/dotnet开发指南.md new file mode 100755 index 0000000..d0516ff --- /dev/null +++ b/dotNet知识库/dotnet开发指南.md @@ -0,0 +1,359 @@ +--- +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 +```