为什么C#/.Net字符串长度以前缀和null结尾?

为什么C#/.Net字符串长度以前缀和null结尾?,c#,.net,string,bstr,null-terminated,C#,.net,String,Bstr,Null Terminated,在阅读和一些类似的问题之后,我发现在C#/.Net中,字符串在内部是以长度前缀和null结尾的,就像在中一样 为什么字符串都是长度前缀且以null结尾,而不是仅以长度前缀?最有可能的原因是,为了确保与COM的轻松互操作性。以下是Jon Skeet博客中关于字符串的摘录: 尽管就API而言,字符串不是以null结尾的,但字符数组是以null结尾的,因为这意味着它可以直接传递给非托管函数,而不涉及任何复制,假设inter-op指定字符串应作为Unicode封送 最好的猜测是,与以O(n)为单位遍历长

在阅读和一些类似的问题之后,我发现在C#/.Net中,字符串在内部是以长度前缀和null结尾的,就像在中一样


为什么字符串都是长度前缀且以null结尾,而不是仅以长度前缀?

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

以下是Jon Skeet博客中关于字符串的摘录:

尽管就API而言,字符串不是以null结尾的,但字符数组是以null结尾的,因为这意味着它可以直接传递给非托管函数,而不涉及任何复制,假设inter-op指定字符串应作为Unicode封送


最好的猜测是,与以O(n)为单位遍历长度相比,查找长度是常数(O(1))。

长度前缀,因此计算长度是
O(1)


以Null结尾使封送到非托管的封送快速进行(非托管可能需要以Null结尾的字符串)。

虽然长度字段使框架可以轻松确定字符串的长度(并且它允许字符串包含零值的字符),但框架(或用户程序)需要大量的东西需要处理以NULL结尾的字符串

例如,像Win32 API

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


请注意,C++的
std::string
类的实现方式是相同的(无论如何在MSVC中)。出于同样的原因,我确信(
c_str()
通常用于将
std::string
传递给需要c样式字符串的对象)。

可能只有@Eric Lippert能够回答这个问题。有充分的理由这样做或那样做(以及权衡)。我和你一样惊讶,C#同时做这两件事。这就是用长度作为字符串前缀的原因。这不是额外使用终止的原因character@Daniel希尔加思:还有为什么我没有重复其他答案。这个问题问双方的理由。对不起,我不理解你的评论-再来一次?这些问题询问将两者结合使用的理由是什么。你是对的,但我想问题是为什么两者同时使用。实际上,确定字符串长度只需要一个或另一个。是的,我想知道为什么两者同时使用,而不仅仅是其中一个(特别是长度前缀)。