这不是又一篇"使用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#的改进版,更是一种全新的思维方式。这些模式帮助你用更少的代码表达更多的含义。今天就采用它们,未来的你将减少调试、更快交付、更令人印象深刻。
![]() |
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |




浙公网安备 33010602011771号