Files
chill_notes/dotNet知识库/dotnet开发指南.md
2026-04-21 11:26:08 +08:00

360 lines
7.7 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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<string>();
// 可空类型
int? nullableNum = null;
string? nullableStr = null;
// 集合初始化
var nums = new[] { 1, 2, 3, 4, 5 };
var names = new List<string> { "张三", "李四" };
// 字典
var dict = new Dictionary<string, int>
{
["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>
{
T GetById(int id);
IEnumerable<T> GetAll();
void Add(T entity);
void Update(T entity);
void Delete(int id);
}
// 继承
public class UserRepository : IRepository<User>
{
public User GetById(int id) { /* ... */ return null; }
public IEnumerable<User> GetAll() { /* ... */ yield break; }
public void Add(User entity) { }
public void Update(User entity) { }
public void Delete(int id) { }
}
```
### 异步编程
```csharp
// async/await
public async Task<User> 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<User> 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<User>
{
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<IUserRepository, UserRepository>();
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<ActionResult<IEnumerable<UserDto>>> GetAll()
{
var users = await _repo.GetAllAsync();
return Ok(users.Select(u => new UserDto(u)));
}
[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> GetById(int id)
{
var user = await _repo.GetByIdAsync(id);
if (user == null) return NotFound();
return Ok(new UserDto(user));
}
[HttpPost]
public async Task<ActionResult<UserDto>> 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<IActionResult> 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<IActionResult> Delete(int id)
{
await _repo.DeleteAsync(id);
return NoContent();
}
}
```
## Entity Framework Core
```csharp
// DbContext
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Order> 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<User>(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<IUserRepository, UserRepository>(); // 每次请求新实例
builder.Services.AddTransient<IMailService, MailService>(); // 每次注入新实例
builder.Services.AddSingleton<ISettings, AppSettings>(); // 全局单例
// 在类中注入
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
```