IsNullOrEmpty仅判断字符串是否为null或长度为0,不处理空白字符;IsNullOrWhiteSpace才真正检测包括空格、制表符等在内的所有空白内容。

IsNullOrEmpty 判断的是什么,不是你想的“空格也算空”
string.IsNullOrEmpty 只检查字符串是否为 null 或长度为 0(即 ""),它**完全忽略空白字符**。如果你传入 " "(三个空格)、"\t\n" 或 " "(全角空格),结果全是 false——它不认为这是“空”。
常见错误现象:
用户提交表单时只打了几个空格,后端用 IsNullOrEmpty 放行了,结果数据库存入了一堆看不见的空白;或者日志里出现 "User name: ' '" 这种尴尬记录。
- 使用场景:适合做快速防御性检查,比如防止
NullReferenceException在调用.Length或.Trim()前崩溃 - 别把它当“内容有效校验”,它不负责语义上的“空”
- 性能上无负担,是静态方法,无装箱、无分配
要判断“真·空内容”,得用 IsNullOrWhiteSpace
string.IsNullOrWhiteSpace 才是你真正需要的“空内容”检测器。它在 IsNullOrEmpty 基础上,额外遍历每个字符,调用 char.IsWhiteSpace(c) 判断——包括空格、制表符、换行、回车、Unicode 分隔符等。
示例对比:
string s1 = ""; // IsNullOrEmpty → true, IsNullOrWhiteSpace → true<br>string s2 = " \t\n "; // IsNullOrEmpty → false, IsNullOrWhiteSpace → true<br>string s3 = "abc"; // 两者都 → false
- 参数差异:两个方法签名完全一致,都是
string s,可直接替换调用 - 兼容性:.NET Framework 4.0+ / .NET Core 1.0+ 都支持,老项目升级后可立刻用
- 性能影响:对纯
null或""的情况,和IsNullOrEmpty一样快;对含空白的字符串,会多一次遍历,但实际业务中几乎感知不到
别在 if 里反复调用,尤其别嵌套 Trim
有人写成这样:
if (!string.IsNullOrEmpty(s) && !string.IsNullOrEmpty(s.Trim())) { ... }
这不仅逻辑重复(s.Trim().Length == 0 等价于 IsNullOrWhiteSpace),还导致两次字符串分配(Trim() 返回新字符串)和两次长度检查。
- 正确做法:一步到位用
string.IsNullOrWhiteSpace(s) - 如果后续还要用“清理后”的值,先缓存再判断:
var trimmed = s?.Trim(); if (!string.IsNullOrEmpty(trimmed)) { ... } - 在高频循环(如日志解析、CSV 行处理)里,这种冗余调用会放大 GC 压力
第三方库或自定义扩展?通常没必要
有人引入 Microsoft.Extensions.Primitives 的 StringValues,或自己写 IsNullOrBlank(加中文全角空格支持),其实多数场景是过度设计。
-
IsNullOrWhiteSpace已覆盖 Unicode 标准定义的全部空白字符,包括全角空格('\u3000')、零宽空格等 - 只有极特殊需求才需扩展:比如把
"N/A"、"--"也视为空,那应该单独封装业务逻辑,而不是改“空”的定义 - 团队协作时,统一用框架原生方法,比各写各的
IsNullOrEmptyOrDash更易读、更少歧义










