SafeMapX — 一种新的通用模式,用于消除 C# 中的空检查、三元运算符和字符串处理

发布: (2025年12月7日 GMT+8 20:23)
3 min read
原文: Dev.to

Source: Dev.to

SafeMapX — 消除 C# 中空检查、三元运算和字符串处理的全新通用模式

每一位在大型 C# 系统中工作的工程师都深有体会:

  • 无尽的 if (x != null)
  • 嵌套的属性访问链
  • 三元运算套三元运算
  • string.IsNullOrWhiteSpace() 的噪音
  • 脆弱的对象图映射
  • 防御性逻辑中埋藏的仓库调用

所有这些导致代码虽然能跑,但却杂乱、表达力弱,并且在团队之间缺乏一致性。

介绍 SafeMapX:C# 的统一防御性逻辑模式

SafeMapX 是一种新设计模式,它把下面的写法:

if (customer != null &&
    customer.Profile != null &&
    customer.Profile.Address != null &&
    customer.Profile.Address.City != null)
{
    return customer.Profile.Address.City.Name;
}
return "Unknown";

转换为这样:

var city = Safe.Guard(customer)
    .Map(c => c.Profile)
    .Map(p => p.Address)
    .Map(a => a.City)
    .Map(c => c.Name)
    .Default("Unknown")
    .Value();

可读、流畅、可预测。没有分支,没有噪音。

为什么 SafeMapX 有效

  • Guard 将对象包装在安全上下文中。
  • Map 按步骤在对象图中前进。
  • 短路机制会在遇到 null 时自动停止。
  • Default 提供最终的回退值。
  • Value() 干净地取出结果。

该模式成为通用的防御性逻辑:没有异常、没有空引用、没有丑陋代码。

DeepPath — 用单个表达式遍历所有路径

var city = Safe.Path(customer, x => x.Profile.Address.City.Name)
                .Default("Unknown")
                .Value();

不需要多步 Map,一次性语义清晰的表达。

异步仓库链(常见企业用例)

var result = await Safe.Guard(await repo.GetCustomer(id))
    .MapAsync(c => repo.GetProfile(c.ProfileId))
    .MapAsync(p => repo.GetAddress(p.AddressId))
    .Map(a => a.City?.Name)
    .Default("Unknown")
    .ValueAsync();

这会显著简化真实业务逻辑。

SafeString — 永别 IsNullOrWhiteSpace

var result = Safe.String(input)
                 .Trimmed()
                 .WhenEmpty("N/A")
                 .Value();

目标

SafeMapX 不只是一个辅助库;它是一套应在全局推广的新模式:

  • 更可读的代码
  • 更少的防御性噪音
  • 更强的意图表达
  • 跨层安全的映射
  • 可测试的管道
  • 内联函数式转换

GitHub 仓库

https://github.com/sandeepbassioec/safemap/

结论

SafeMapX 并非另一种工具库——它是一种在 C# 中表达防御性逻辑的新方式。
如果你的企业代码中充斥着 ???.if (x != null),不妨立即尝试 SafeMapX。

Back to Blog

相关文章

阅读更多 »

Show HN:Detail,Bug Finder

嗨 HN,tl;dr 我们构建了一个 bug finder,效果非常好,特别是针对 app backends。试试看并把你的想法发给我们!下面是详细内容。