2011-06-09 119 views
18

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

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

+2

也许只有@Eric Lippert才能够回答这个问题。做一个或另一个有很好的理由(以及折衷方案)。我感到很惊讶,因为C#可以兼得**。 – Yuck 2011-06-09 13:32:05

+1

@Yuck - 或Jon Skeet – Xaisoft 2011-06-09 13:34:29

回答

21

长度的前缀使计算长度为O(1)

Null终止,使封送处理非快速封锁(非托管可能期望以空字符结尾的字符串)。

4

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

13

下面是乔恩斯基特的博客Post关于字符串的摘录:

虽然字符串不是空终止至于API而言,字符数组是空值终止的,因为这意味着它可以直接传递给非托管函数而不涉及任何复制,假设inter-op指定该字符串应该编码为Unicode。

0

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

+0

这就是在字符串前加上长度的原因。这不是额外使用终止字符的原因 – 2011-06-09 13:35:29

+1

@Daniel Hilgarth:为什么我没有复制其他答案。这个问题提出了双方的推理。 – leppie 2011-06-09 13:36:25

+1

对不起,我不明白你的评论 - 再来一次?问题是什么是合理使用**的理由**。而不是自己的推理是什么 – 2011-06-09 13:37:15

3

虽然长度字段使框架很容易确定字符串的长度(并且它允许字符串包含零值的字符),但框架(或用户程序)需要的东西非常多处理那些期望NULL结束的字符串。例如,像Win32 API一样,

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

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