C# String.IsNullOrEmpty未检测到C中的转义序列NULL\0#
我尝试了下面的if语句,但if未能检测到NULLC# String.IsNullOrEmpty未检测到C中的转义序列NULL\0#,c#,string,null,escaping,isnullorempty,C#,String,Null,Escaping,Isnullorempty,我尝试了下面的if语句,但if未能检测到NULL void Main() { string str = "\0".Trim(); if (string.IsNullOrEmpty(str)) { "Empty".Dump(); } else { "Non-Empty".Dump(); } } 请参考LinqPad快照 我得到了输出 Non-Empty 我不知道它是如何失败的。请帮助我。您的字符串包含一个
void Main()
{
string str = "\0".Trim();
if (string.IsNullOrEmpty(str))
{
"Empty".Dump();
}
else
{
"Non-Empty".Dump();
}
}
请参考LinqPad快照
我得到了输出
Non-Empty
我不知道它是如何失败的。请帮助我。您的字符串包含一个字符
\0
此字符不可打印,因此您在手表中看不到它,但如果将
str.Length
添加到手表中,您将看到“1”
那么,字符串是否为空?当然没有,是空的吗?不,它包含字符。因此,
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字符等。输出是正确的。字符串不是空的,它包含一个'\0'
。在C语言中,字符串以二进制零结尾,在C语言中,没有这样的约定。也许是LinqPad用这种方式表示的?我在VS 2013中尝试过,值“\0”被替换,您可以从字符串中删除所有\0。您能详细说明为什么希望非空字符串为空吗?@PatrickHofman我粗略计算了转义字符,因为我注意到\0
表示为null
。我是初学者,所以我在string.IsNullorEmpty
中尝试了这个\0
,但失败了。这就是我发布这个问题的原因。为什么你要删除IsNullOrWhiteSpace
,哪一个更适合这个问题?@patrickhoffman我决定使用IsNullOrEmpty
,因为它更接近OP的代码,而且Trim()
保证如果字符串只是空白,它将变为空。然而,你是对的,IsNullOrWhiteSpaces
比仅仅修剪空白和标签更聪明,所以我在评论中提到了它。非常感谢。