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

7.7 KiB
Executable File
Raw Blame History

title, tags, created
title tags created
.NET 开发知识库
dotNET
CSharp
ASPNET
Microsoft
Backend
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