为什么C#/ .net字符串长度为前缀且空终止?

时间:2011-06-09 13:24:12

标签: c# .net string bstr null-terminated

在阅读What's the rationale for null terminated strings?和一些类似的问题之后,我发现在C#/。内部,Net字符串都是长度前缀的,并且在BSTR Data Type中都是空终止的。

字符串长度前缀和空终止的原因是什么,而不是例如。只有长度前缀?

5 个答案:

答案 0 :(得分:21)

长度前缀,以便计算长度为O(1)

Null终止,以便对非托管超快速进行编组(非托管可能需要以空字符结尾的字符串)。

答案 1 :(得分:13)

以下摘录自Jon Skeet关于字符串的博客Post

  

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

答案 2 :(得分:4)

最有可能的是,确保与COM的轻松互操作性。

答案 3 :(得分:3)

虽然length字段使框架可以很容易地确定字符串的长度(并且它允许字符串包含零值的字符),但框架(或用户程序)需要处理的内容非常多期望NULL终止字符串。

例如,与Win32 API类似。

因此,在字符串数据的末尾保持一个NULL终止符是很方便的,因为它可能需要经常出现在那里。

请注意,C ++的std::string类以相同的方式实现(无论如何在MSVC中)。出于同样的原因,我确信(c_str()经常被用来将std::string传递给想要C风格字符串的东西。

答案 4 :(得分:0)

最好的猜测是,与遍历它相比,找到长度是常数(O(1)),在O(n)中运行。