7个现代C#实战模式:微软精英团队都在用的高效编程技巧

作者:微信公众号:【架构师老卢】
7-1 8:54
17

这不是又一篇"使用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)
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对象映射器

⚡ 模式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:按需使用无接口的依赖注入

// 旧方式(不必要的接口抽象)
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);
});

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

参考:无接口依赖注入

🧠 模式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#的改进版,更是一种全新的思维方式。这些模式帮助你用更少的代码表达更多的含义。今天就采用它们,未来的你将减少调试、更快交付、更令人印象深刻。

🔥 喜欢这7个天才模式吗?你的旅程才刚刚开始。 这篇文章的反响非常热烈,还有更多内容值得分享。

👉 在第二部分中,我将揭示7个新的现代C#模式——从作用域日志到C# 12集合表达式——这些已经被顶级微软工程师和高性能.NET团队采用的技术。

相关留言评论
昵称:
邮箱:
阅读排行