C# - "\0"代表什么?

29

我正在玩弄Pex,其中一个参数传递到我的方法中是"\0"

这是什么意思?根据我的方法内容,我猜它是一个空字符串("")。但是,如果它和空字符串相同,为什么不直接使用""而要使用"\0"呢?

有人知道它是什么吗?


它是传递包含反斜杠后跟零的字符串,还是传递包含空字符的字符串? - Anon.
这是代码的含义: this.TestSaveString("\0"); - Vaccano
感谢所有出色的回答!我选择了Randolpho的答案,因为它提供了最详细的关于发生了什么的描述。 - Vaccano
6个回答

44

'\0'是一个“Null字符”,在C和某些部分的C++中用于终止字符串。Pex正在测试您的代码如何处理空字符,很可能正在寻找Poison Null Byte安全漏洞。

大多数C#代码无需担心;但如果将字符串传递给非托管代码,则可能会遇到问题。

编辑:

只是为了明确... Pex正在传递包含空字符的字符串。这不是空引用。


3
请注意,NULL字符串与空字符串并不相同。来自MSDN文章的描述是:“相比之下,null字符串并不是指向System.String对象实例的引用,任何尝试在null字符串上调用方法都会导致NullReferenceException异常。但是,您可以将null字符串与其他字符串进行拼接和比较操作。以下示例说明了某些情况下引用null字符串会和不会导致抛出异常。” - jfawcett

6

它是一个带有空字符的字符串。旧的字符串库(例如C语言或旧的C++库)使用'\0'字符来表示字符串的结尾。

新的环境,比如.Net使用不同的系统,但是以'\0'来结束字符串的历史很长,因此这是一个常见的错误点。测试库,例如Pex,将使用它来确保您的程序正确处理它。


额……我不忍心给这个点赞-1,但是看起来你在暗示C#字符串是以空字符结尾的。它们并不是。 - Randolpho
1
@Randolpho “像 .Net 这样的新环境使用不同的系统”——对我来说,我似乎在暗示相反的意思。 - Joel Coehoorn
是的。我不确定任何类似那样的东西是如何暗示的。 - Andrew
我想我被你的第一句话卡住了。提问者显然在使用.NET。Pex没有传递带有“额外空字符”的字符串,而是传递了一个包含单个空字符的字符串。“额外空字符”意味着字符串中有两个空字符,一个在字符串中,另一个终止字符串。但事实并非如此。我不会像@mobrule那样明确指出这一点,但对我来说它已经非常明显了。 - Randolpho
越想越觉得没问题了。我想我只需要编辑一下第一句话然后给你点赞 :) - Randolpho

5

这是一个包含字符 '\0' 的字符串。在C#中,它并没有特别的处理方式 - 它只是Unicode字符U+0000。如果您写:

int firstCodePoint = text[0];

那么你会发现firstCodePoint的值为0。


3
Escape Sequence  
\0    
Character Name 
Null    
Unicode Encoding     
0x0000

See this link.


2

一个长度为1的字符串,包含字符\u0000(也称NUL)。该字符不会被特殊处理。

C语言中使用\0来终止字符串,因此您需要分配一个长度为1的字符串。在这种情况下,标准的字符串函数将报告长度为0,因为字符串包含\0并以其结尾。您可以安全地修改str [0],或者将单个字符strncat到其中。


1

我刚刚发现一个很好的例子,其中\0非常重要且必要。

假设我们想要在以下代码中删除最后一个不必要的,

for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
}

enter image description here

如果我们只是按照以下方式添加Console.Write("\b\n");
for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
    Console.Write("\b\n");
}

输出结果仍将保持不变。
但是,如果我们像下面这样添加\0
for (int i = 0; i < 5; i++)
{
    foreach (var a in "Money")
        Console.Write($"{a},");
    Console.Write("\b\0\n");
} 

不需要解释,直接翻译:

不需要的尾随,会消失。

enter image description here


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