7.7 KiB
Executable File
7.7 KiB
Executable File
title, tags, created
| title | tags | created | |||||
|---|---|---|---|---|---|---|---|
| .NET 开发知识库 |
|
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# 核心语法
基础类型
// 值类型
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
};
类与接口
// 类
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) { }
}
异步编程
// 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 查询
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
最小模板
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 示例
[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
// 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();
依赖注入
// 注册方式
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;
}
}
常用命令
# 创建项目
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