这不是又一篇"使用async/await"的老生常谈。这些是微软团队和顶级工程组织正在使用的7个现代、高度实用的C#实战模式。如果你还在写重复的服务、混乱的条件判断或冗长的映射代码——请坚持看到最后,这些模式将彻底改变你编写C#的方式。
// 旧方式
if (user == null) throw new ArgumentNullException(nameof(user));
// 新方式
ArgumentNullException.ThrowIfNull(user);
✅ 意图更清晰、无需大括号、编译器优化、.NET 6+可用
参考:Microsoft文档
// 旧方式
public class ProductDto {
public string Name { get; set; }
public decimal Price { get; set; }
}
// 新方式
public record ProductDto(string Name, decimal Price);
✅ 默认不可变、简洁、支持内置值相等性,完美适合API契约
参考:记录类型文档
// 旧方式(AutoMapper)
public class OrderDto {
public string Id { get; set; }
public string CustomerName { get; set; }
}
var dto = _mapper.Map<OrderDto>(order); // 运行时使用反射
// 新方式(使用Mapperly源生成器)
[Mapper]
public static partial class OrderMapper {
public static partial OrderDto ToDto(this Order order);
}
// 使用
var dto = order.ToDto(); // 纯编译时映射
✅ 编译时生成映射、无运行时反射、更快更安全更易调试,适合高性能API
参考:Mapperly - 快速、源生成的.NET对象映射器
// 旧方式
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表达式使模式匹配更易读、更安全
参考:模式匹配文档
// 旧方式(传统MVC)
[ApiController]
[Route("[controller]")]
public class PingController : ControllerBase
{
[HttpGet]
public string Get() => "pong";
}
// 新方式(.NET 6+极简API)
app.MapGet("/ping", () => "pong");
✅ 无需控制器、无样板代码,完美适合轻量级微服务、API和快速原型开发
参考:极简API文档
// 旧方式(不必要的接口抽象)
public interface IOrderService
{
string GetSummary();
}
public class OrderService : 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);
});
✅ 当不需要模拟或替换实现时使用具体类型,保持代码简洁避免过度抽象
参考:无接口依赖注入
// 旧方式(查询中硬编码逻辑)
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#的改进版,更是一种全新的思维方式。这些模式帮助你用更少的代码表达更多的含义。今天就采用它们,未来的你将减少调试、更快交付、更令人印象深刻。
🔥 喜欢这7个天才模式吗?你的旅程才刚刚开始。 这篇文章的反响非常热烈,还有更多内容值得分享。
👉 在第二部分中,我将揭示7个新的现代C#模式——从作用域日志到C# 12集合表达式——这些已经被顶级微软工程师和高性能.NET团队采用的技术。