C#中的字符串结尾

时间:2014-07-19 07:09:51

标签: c#

当存储在内存中时,字符串是否以\0字符结尾?编译器如何知道结束?

如果是,那么

Console.WriteLine(str.LastIndexOf('\0'));

必须返回长度,但输出为= -1

2 个答案:

答案 0 :(得分:8)

来自MSDN

  

在内部,文本存储为Char对象的顺序只读集合。 C#字符串末尾没有空终止字符;因此,C#字符串可以包含任意数量的嵌入空字符(' \ 0')。

另外,来自Jon Skeet的Strings in .NET and C#

  

尽管字符串在API方面没有空终止,但字符数组是以空值终止的,因为这意味着它可以直接传递给非托管函数而不涉及任何复制,假设相互之间op指定应该将字符串编组为Unicode。

简而言之,内部char数组以\0结尾,但API(例如LastIndexof)忽略它。

此外,如果您手动在ac#string的中间中插入\0 (例如Hello\0World),C#字符串API将忽略它,但其他API&# 39; s可能没有并最终忽略了第一个\0之后的所有内容(例如,World)。

查看reference source

public override int GetHashCode() {
    //...
    Contract.Assert(src[this.Length] == '\0', "src[this.Length] == '\\0'");
    //...
}

答案 1 :(得分:2)

string对象包含字符串的长度,这就是它知道结尾的位置。 实际上,字符串末尾有'\ 0'符号表示非托管兼容性,但您无法从托管代码访问它。