为什么string.IsNullOrWhiteSpace(“\ 0”)为false

时间:2015-06-25 14:53:53

标签: .net string c#-4.0

我遇到了一个问题,其中隐形字符\0非常像一个'白色空间',不被字符串视为空白.IsNullOrWhiteSpace方法。我想知道为什么这样在.NET中以这种方式实现,是否有任何替代string.IsNullOrWhiteSpace可以正确处理空终止字符? 提前谢谢。

6 个答案:

答案 0 :(得分:18)

基本上,

U+0000不是空白。 char.IsWhitespace('\0')返回false,它没有列为空格...

IsNullOrWhitespace null 部分引用字符串引用本身 - 而不是内容,如果这是您的想法。

请注意,.NET中的字符串在托管代码中不会在逻辑上“以空值终止”,但实际上在CLR级别它们是为了互操作。 (字符串知道它自己的长度,但是为了更容易使用 期望一个空终止符的本机代码,CLR确保在字符串的内容之后总是有一个U + 0000 。)如果你最终得到一个包含\0的字符串,那你应该修改一下它开始生成的字符串。

答案 1 :(得分:4)

您可以用空格字符替换所有\0个字符,然后检查空格。

string.IsNullOrWhiteSpace("\0".Replace('\0', ' ');

答案 2 :(得分:3)

出于有趣的历史原因(它们肯定很有趣,但我无法找到它们),null有两个含义...... null指针/引用(称为{{ C)中的1}}和NULL(或NULNULL字符。

String.IsNullOrWhiteSpace

  

指示指定的字符串是空,空还是仅包含空格字符。

\0表示" null引用",空意味着空白空间含义

  

空白字符由Unicode标准定义。 null方法解释在将IsNullOrWhiteSpace方法作为空格字符传递给Char.IsWhiteSpace方法时返回值为true的任何字符。

Char.IsWhiteSpace页面中显示Char.IsWhiteSpace考虑​​空格的字符列表。

答案 3 :(得分:2)

'\ 0'字符不被视为空格。有关被视为空格的字符列表,请参阅Char.IsWhitespace()

如果您有自己的要求,请使用Enumerable.All(),或者甚至只添加自己的几个字符。像这样:

bool IsMyKindOfWhiteSpace(string input)
{
    char[] more = new char[] { <here goes your list of additional white space chars> };

    return input.All(x => Char.IsWhiteSpace(x) || more.Contains(x));
}

答案 4 :(得分:0)

NULL字符串IS与空字符串或空格

不同

答案 5 :(得分:0)

创建一个扩展方法,将null char作为一个检查添加。

public bool IsNullOrWhitespaceOrHasNullChar(this string text)
{
   return string.IsNullOrWhiteSpace(text) || Regex.IsMatch(text, "\0");
}

请注意,null char存在于字符串中的任何位置,它将被发现并报告,因此带有“a \ 0”的字符串将返回true。如果这是一个问题,请创建一个检查完整字符串\0的测试。