你的字符串包含一个字符\0
。
这个字符是不可打印的,因此在监视器中看不到它,但如果你将str.Length
添加到监视器中,你会看到它的值为"1"。
那么,你的字符串是null吗?绝对不是。它是空的吗?不是,它包含字符。
因此,string.IsNullOrEmpty
逻辑上的结果为false
并输出"Non-Empty"。
如果出于某种原因你收到包含\0
字符的字符串,并希望将其视为空字符串,你只需将\0
去掉即可:
string str = "\0".Trim(new[] { '\0', ' ', '\t' });
if (string.IsNullOrEmpty(str))
{
"Empty".Dump();
}
else
{
"Non-Empty".Dump();
}
这将输出 "空"。
根据Patrick Hofman的建议,最好使用string.IsNullOrWhiteSpace
,因为它更适合此情况,并且可以处理更广泛的空白字符、不可见字符、BOM字符等。
IsNullOrWhiteSpace
的代码呢?它更适合这种情况。 - Patrick HofmanIsNullOrEmpty
,因为它更接近于OP的代码,并且Trim()
保证了字符串如果只包含空格,则会变为空。然而,你是对的,IsNullOrWhiteSpaces
比仅裁剪空格和制表符更聪明,所以我在注释中提到了它。谢谢。 - Yeldar Kurmangaliyev
'\0'
。在 C 中,字符串以二进制零终止,在 C# 中没有这样的约定。 - René Vogt\0
表示为null
。作为初学者,我尝试在string.IsNullorEmpty
中使用\0
,但它失败了。这就是我发表这个问题的原因。 - user7784919