最安全的字符串空值判断是用 string.IsNullOrEmpty(),它内部已做 null 检查和长度判断,避免 NullReferenceException;需忽略空白字符时改用 string.IsNullOrWhiteSpace();对外方法参数校验应抛出 ArgumentNullException 或 ArgumentException,而非泛化异常。

用 string.IsNullOrEmpty() 判断字符串是否为空最安全
直接用 string.IsNullOrEmpty(),别自己写 str == null || str.Length == 0。它内部做了 null 检查和长度判断,且经过 JIT 优化,性能不输手写,还避免了空引用异常风险。
常见错误是只判 str.Length == 0,结果传入 null 就抛出 NullReferenceException;或者用 str == "",漏掉 null 且无法处理 Unicode 零宽字符等边界情况。
-
string.IsNullOrEmpty(null)→true -
string.IsNullOrEmpty("")→true -
string.IsNullOrEmpty(" ")→false(注意:带空格不算“空”)
需要忽略空白字符时用 string.IsNullOrWhiteSpace()
用户输入、配置读取、API 参数常含首尾空格或制表符,仅用 IsNullOrEmpty 会放过这些“逻辑空值”。此时必须升级到 string.IsNullOrWhiteSpace()。
它比 IsNullOrEmpty 多一步 Unicode 空白判定(如 '\t'、'\u2000'),但代价是遍历整个字符串——对超长字符串(如几 MB 的日志片段)有轻微性能影响,不过绝大多数参数校验场景完全可忽略。
-
string.IsNullOrWhiteSpace(" \t\n\r ")→true -
string.IsNullOrWhiteSpace("\u2000")→true(Unicode 空格) - 不推荐在高频循环里对 mega-string 调用它
方法参数校验推荐用 ArgumentNullException + ArgumentException
对外暴露的公共方法,参数为空必须立刻报错,不能让错误蔓延到深层逻辑。C# 8+ 可配合可空引用类型(NRT)静态检查,但运行时仍需手动防护。
不要只打日志或返回默认值——调用方需要明确知道哪里错了。抛出的异常类型要精准:null 就用 ArgumentNullException,非空但非法(如空字符串用于必填用户名)就用 ArgumentException 或其子类 ArgumentException。
- 用
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name)); - 用
if (string.IsNullOrWhiteSpace(email)) throw new ArgumentException("Email cannot be empty", nameof(email)); - 别写
throw new Exception("name is null")—— 框架和调试器认不出语义
ASP.NET Core API 中用 [Required] 和 [StringLength] 自动校验
Web API 场景下,别在 Controller 里手写一堆 IsNullOrWhiteSpace。模型绑定阶段就能拦截,更干净、可测试、支持国际化错误提示。
注意:这些特性只对 ModelState 生效,不会阻止 null 进入 action 方法体(除非开启 NRT 并设 string!)。所以 DTO 层用特性,内部 service 层仍建议二次校验——因为 service 可能被其他非 Web 路径调用。
-
[Required(ErrorMessage = "Name is required")]对应IsNullOrWhiteSpace -
[StringLength(50, MinimumLength = 2)]同时防空和超长 - 记得在 action 里加
if (!ModelState.IsValid) return BadRequest(ModelState);
实际项目里最容易被忽略的是:跨层校验责任不清晰。DTO 有 [Required],service 层又写一遍 throw new ArgumentNullException,看似冗余,实则是防御性编程的必要重复——因为 service 层可能脱离 Web 上下文被单元测试或后台任务直接调用。









