惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
月光博客
月光博客
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
Y
Y Combinator Blog
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
爱范儿
爱范儿
B
Blog RSS Feed
V
Visual Studio Blog
MyScale Blog
MyScale Blog

博客园 - lzhdim

大展宏图 - 我的闪存 20260916 - 个人小作品更新 C#代码复杂度警示录:20个真实案例揭示如何编写更简洁、可维护的代码 C#性能杀手TOP10:你的代码中招了吗? 20260913 - 个人小作品更新 宝马Z4借壳复活!改装版Spider亮相:售价约90万、限量99台 C#开发的ScreenSaver屏保应用 - 开源研究系列文章 - 个人小作品 25个每个开发人员都应该掌握的JavaScript 数组方法 20260831 - 个人小作品更新 C#使用SQLite数据库例子 - 开源研究系列文章 20260830 - 个人小作品更新 20260829 - 个人小作品更新 13、JavaScript事件循环机制 - JavaScript学习系列文章 首款媲美分体水冷的一体水冷!微星CORELIQUID E15 360水冷散热器评测:目前为止 锐龙9 9950X3D最强性能释放 JavaScript常见的内存泄露问题 - JavaScript学习系列文章 C#开发的颜色取色器 - 开源研究系列文章 - 个人小作品 成长环境 - 我的闪存 提高 SQL 语句执行速度的方法 JavaScript安全最佳实践 关闭iPhone一些默认设置,让iPhone更流畅 20260814 - 个人小作品更新 JavaScript对象与元编程 20260812 - 个人小作品更新 JavaScript 模块化系统 Markdown 语法完全指南 C# 通过 Windows API 实现进程内存读写操作 JavaScript 函数进阶课题 C#开发的基于钩子技术监测键鼠事件的例子 - 开源项目研究文章 JavaScript异步编程的演进 近十年最帅风冷!酷冷至尊V8 ACE 3DHP散热器评测:单塔能干翻双塔
7个现代C#实战模式:微软精英团队都在用的高效编程技巧
lzhdim · 2026-09-06 · via 博客园 - lzhdim

这不是又一篇"使用async/await"的老生常谈。这些是微软团队和顶级工程组织正在使用的7个现代、高度实用的C#实战模式。如果你还在写重复的服务、混乱的条件判断或冗长的映射代码——请坚持看到最后,这些模式将彻底改变你编写C#的方式。

🔥 模式1:函数式守卫替代If-Else

// 旧方式
if (user == null) throw new ArgumentNullException(nameof(user));

// 新方式
ArgumentNullException.ThrowIfNull(user);

✅ 意图更清晰、无需大括号、编译器优化、.NET 6+可用

参考:Microsoft文档

🔄 模式2:使用记录类型(Records)和Init-only属性处理DTO

// 旧方式
public class ProductDto {
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// 新方式
public record ProductDto(string Name, decimal Price);

✅ 默认不可变、简洁、支持内置值相等性,完美适合API契约

参考:记录类型文档

� 模式3:使用源生成器(Source Generators)进行对象映射

// 旧方式(AutoMapper)
publicclassOrderDto {
    publicstring Id { get; set; }
    publicstring CustomerName { get; set; }
}

var dto = _mapper.Map<OrderDto>(order); // 运行时使用反射

// 新方式(使用Mapperly源生成器)
[Mapper]
publicstaticpartialclassOrderMapper {
    public static partial OrderDto ToDto(this Order order);
}

// 使用
var dto = order.ToDto(); // 纯编译时映射

✅ 编译时生成映射、无运行时反射、更快更安全更易调试,适合高性能API

参考:Mapperly - 快速、源生成的.NET对象映射器

⚡ 模式4:模式匹配+Switch表达式

// 旧方式
if (shape is Circle c)
    result = $"圆形半径 {c.Radius}";
else if (shape is Square s)
    result = $"正方形边长 {s.Side}";
else
    result = "未知形状";

// 新方式
string result = shape switch
{
    Circle c => $"圆形半径 {c.Radius}",
    Square s => $"正方形边长 {s.Side}",
    _ => "未知形状"
};

✅ 无需类型转换、代码更简洁,Switch表达式使模式匹配更易读、更安全

参考:模式匹配文档

🎯 模式5:.NET 6+极简API

// 旧方式(传统MVC)
[ApiController]
[Route("[controller]")]
public class PingController : ControllerBase
{
    [HttpGet]
    public string Get() => "pong";
}

// 新方式(.NET 6+极简API)
app.MapGet("/ping", () => "pong");

✅ 无需控制器、无样板代码,完美适合轻量级微服务、API和快速原型开发

参考:极简API文档

🔍 模式6:按需使用无接口的依赖注入

// 旧方式(不必要的接口抽象)
publicinterfaceIOrderService
{
    string GetSummary();
}

publicclassOrderService : IOrderService
{
    public string GetSummary() => "您有3个新订单";
}

builder.Services.AddScoped<IOrderService, OrderService>();

// 新方式(简化版,无需接口)
builder.Services.AddScoped<OrderService>();

app.MapGet("/order-summary", (OrderService service) =>
{
    var summary = service.GetSummary();
    return Results.Ok(summary);
});

✅ 当不需要模拟或替换实现时使用具体类型,保持代码简洁避免过度抽象

参考:无接口依赖注入

🧠 模式7:表达式树实现可配置规则

// 旧方式(查询中硬编码逻辑)
var highValueOrders = dbContext.Orders
    .Where(o => o.Total > 100 && o.Status == "Paid")
    .ToList();

// 新方式(可配置、可重用的表达式树)
Expression<Func<Order, bool>> filter = o => o.Total > 100 && o.Status == "Paid";
var highValueOrders = dbContext.Orders.Where(filter).ToList();

✅ 完全编译安全且可重用,允许向LINQ或EF Core查询传递动态可配置过滤器,完美适合构建查询构建器或规则引擎

参考:C#表达式树文档

📌 关键收获

现代C#不仅是旧版C#的改进版,更是一种全新的思维方式。这些模式帮助你用更少的代码表达更多的含义。今天就采用它们,未来的你将减少调试、更快交付、更令人印象深刻。