当存储在内存中时,字符串是否以\0
字符结尾?编译器如何知道结束?
如果是,那么
Console.WriteLine(str.LastIndexOf('\0'));
必须返回长度,但输出为= -1
答案 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
)。
public override int GetHashCode() {
//...
Contract.Assert(src[this.Length] == '\0', "src[this.Length] == '\\0'");
//...
}
答案 1 :(得分:2)
string
对象包含字符串的长度,这就是它知道结尾的位置。
实际上,字符串末尾有'\ 0'符号表示非托管兼容性,但您无法从托管代码访问它。