判断一段文字到底有没有内容,C# 字符串为空的检查最常用三种:用 string.IsNullOrEmpty 一次性判断 null 和空串,用 Length 直接比长度,或者用 == string.Empty 做相等比较。三种写法都能用,但安全性和适用场景差很多。本文讲清它们的区别和怎么选,帮你避开“空引用”这个新手最常踩的雷。很多新手代码一运行就抛出 NullReferenceException,多半就是空判断没写对。选对判断方法,这类异常能少一大半,所以值得把三种写法一次弄清楚。
一、先搞懂:C# 里“空”其实有两种
在 C# 里,一个字符串变量可能处于两种“没内容”的状态:一种是值为 null,表示这个变量根本没指向任何字符串对象;另一种是值指向了一个真实但长度为 0 的字符串(也就是 "")。这两种情况长得像,但本质不同:对 null 调用任何方法都会直接抛 NullReferenceException,而对 "" 调用方法则完全正常。
所以判断 C# 字符串为空,第一步就得想清楚:我要查的是“完全没对象”,还是“有对象但没字”?想弄懂 C# 这门语言的整体定位,C# 与 C++ 区别 一文把几门 C 家族语言的差异讲得很清楚,可以对照着建立认知。
💡 小提示:在 C# 里字符串是引用类型,变量存的是“地址”而不是“内容”。null 表示地址为空,"" 表示地址指向一个空盒子。这个区别决定了下面每种判断方式的安全边界。
顺带说一句,C# 的字符串是不可变的(immutable):你以为的“修改”其实是生成了一个新字符串,原来的那份还在。这跟空判断的关系在于——你拿到的字符串变量,可能是别人方法返回的、可能是数据库读出来的、也可能是接口 JSON 解析来的,来源越不可控,它越可能是 null。所以判断空从来不是一个孤立的语法题,而是“数据从哪来”的安全意识。
二、方法一:string.IsNullOrEmpty 最省心(首选)
这是最推荐、也最安全的写法。IsNullOrEmpty 会一次性检查:如果字符串是 null,或者长度是 0,都返回 true。一句话把两种“空”都兜住了。
string name = GetName();
if (string.IsNullOrEmpty(name))
{
Console.WriteLine("名字为空或没赋值");
}
上面这段里,不管 name 是 null 还是 "",IsNullOrEmpty 都会返回 true,你不用自己先判 null 再判长度,少写一行就少一个出错点。在 C# 字符串为空的日常判断里,它几乎是默认首选。

三、方法二:用 Length 直接比长度(最直接)
如果你已经能 100% 确定变量不是 null(比如它刚被赋了值),那直接比 Length 也行。长度等于 0,就说明是空串。
string name = "hello";
if (name.Length == 0)
{
Console.WriteLine("是空串");
}
上面这段里,name.Length == 0 就是“空串”的直白表达。这种写法性能上没啥问题,但有个硬前提:name 不能是 null,否则 name.Length 立刻抛空引用异常。所以它适合“变量来源可控、绝不可能是 null”的局部场景,不适合处理外部输入。
四、方法三:== string.Empty 或 == "" 比较(最直白)
第三种是“相等比较”:拿变量和空串比一比,相等就是空。string.Empty 和 "" 在 C# 里基本等价,都代表那个长度为 0 的空串。
string name = GetName();
if (name == string.Empty)
{
Console.WriteLine("是空串");
}
上面这段里,name == string.Empty 只判断“内容是不是空串”,它不会处理 null——如果 name 是 null,这个比较的结果是 false(而不是报错),容易让你误以为“有值”。所以这种写法适合你已经排除 null 之后,单纯想确认“是不是一个空串”的场景。关于这门语言本身,C# 是什么 从零讲清了它的来龙去脉,适合入门补基。
五、三种写法怎么选,以及两个坑
选型口诀很简单:凡是处理“外部输入、可能为 null”的字符串,一律用 string.IsNullOrEmpty(或 IsNullOrWhiteSpace);只有你确信变量不可能是 null 的局部场景,才用 Length == 0 或 == string.Empty 图省事。判断 C# 字符串为空,safest 的默认答案永远是 IsNullOrEmpty。
真实项目里,需要判断字符串是否为空的地方非常多:用户表单提交的用户名、从数据库读出来的姓名、调用第三方接口返回的报文。凡是“外部来的、你控制不了”的字符串,进业务逻辑之前都该先过一遍 IsNullOrEmpty。把它养成习惯,能挡掉一大类生产环境的空引用崩溃,比事后逐个 try-catch 省心得多。
坑一:对 null 调 Length 或 == 直接崩。 很多新手写 if (name.Length == 0) 却忘了 name 可能来自数据库或接口、本身就是 null,一运行就 NullReferenceException。凡是来源不可控,先扔给 IsNullOrEmpty。
坑二:分不清“空串”和“全是空格”。 IsNullOrEmpty 认为 " "(一串空格)不是空,因为它长度大于 0。如果你的业务要把“纯空格”也算空,得用 string.IsNullOrWhiteSpace,它会把空白字符一并视为空。
⚠️ 注意:IsNullOrWhiteSpace 比 IsNullOrEmpty 更宽。需要“用户没填任何有效内容就算空”时用前者;只需要“严格判断是不是 null 或空串”时用后者,别混用导致校验过松或过紧。
总结
C# 字符串为空,核心就一句话:来源不可控就用 string.IsNullOrEmpty,它把 null 和空串一次性兜住最安全;变量来源确定不是 null 时,才用 Length == 0 或 == string.Empty 这种直白写法。请记住最关键的一点——凡是从外部拿来的字符串,别直接碰它的 Length 或做相等比较,先过一遍 IsNullOrEmpty,空引用异常就能少一大半。
常见问题
Q:IsNullOrEmpty 和 IsNullOrWhiteSpace 到底用哪个?
A:只关心“是不是 null 或空串”用 IsNullOrEmpty;还要把“全是空格、制表符”也算作空(比如表单校验)就用 IsNullOrWhiteSpace。后者更宽松,按业务需要选。
Q:为什么我对 null 用 name.Length 会报错?
A:因为 null 表示变量没有指向任何对象,自然也就没有 Length 这个属性可访问,调用即抛 NullReferenceException。用 IsNullOrEmpty 这类静态方法就不需要先有对象,所以安全。
Q:== string.Empty 和 == "" 有区别吗?
A:在 C# 里两者基本等价,都表示长度为 0 的空串。推荐写 string.Empty,语义更清晰、且不会被误改成带空格的 " "。但无论哪种,它们都不处理 null,变量为 null 时比较结果是 false 而非异常。
延伸学习
想把 C# 基础打得更牢,可以按这个顺序来:

免费 AI IDE



