Update from Sync Service
This commit is contained in:
359
dotNet知识库/dotnet开发指南.md
Executable file
359
dotNet知识库/dotnet开发指南.md
Executable file
@@ -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<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
|
||||
```
|
||||
Reference in New Issue
Block a user