在C#中,String.IsNullOrEmpty无法检测到转义序列NULL \0

3
我尝试了以下的if语句,但它无法检测到NULL。
void Main()
{
    string str = "\0".Trim();
    if (string.IsNullOrEmpty(str))
    {
        "Empty".Dump();
    }
    else
    {
        "Non-Empty".Dump();
    }
}

请参考LinqPad截图。 enter image description here 我获得了输出。
Non-Empty

我不知道它为什么失败了。请帮助我。


1
输出是正确的。字符串不为空,它包含一个 '\0'。在 C 中,字符串以二进制零终止,在 C# 中没有这样的约定。 - René Vogt
也许是 LinqPad 显示的方式?我在 VS 2013 中尝试了一下,值为“\0”。 - Gururaj
通过使用replace函数,您可以从字符串中删除所有\0。 - Shahrooz Ansari
你能解释一下为什么你认为非空字符串是空的吗? - Patrick Hofman
@PatrickHofman 我处理了转义字符,在那里我注意到\0表示为null。作为初学者,我尝试在 string.IsNullorEmpty 中使用\0,但它失败了。这就是我发表这个问题的原因。 - user7784919
显示剩余3条评论
1个回答

7

你的字符串包含一个字符\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 Hofman
@PatrickHofman,我决定使用IsNullOrEmpty,因为它更接近于OP的代码,并且Trim()保证了字符串如果只包含空格,则会变为空。然而,你是对的,IsNullOrWhiteSpaces比仅裁剪空格和制表符更聪明,所以我在注释中提到了它。谢谢。 - Yeldar Kurmangaliyev
但是,IsNullOrWhiteSpaces仍然无法检测\0,因此对于该特定情况仍需要进行修剪。 - bkqc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接