为什么C#/.NET字符串是长度前缀和空终止的?

21

2
可能只有 @Eric Lippert 能够回答这个问题。做一种或另一种方法都有充分的理由(以及权衡利弊)。我和你一样惊讶于 C# 居然两者都做到了。 - Yuck
5个回答

21

添加长度前缀以使计算长度的时间复杂度为O(1)

以空字符结尾以进行编组到非托管代码的快速处理(非托管代码通常期望以空字符结尾的字符串)。


12

这是Jon Skeet关于字符串的博客文章Post的摘录:

尽管从API的角度来看,字符串并不是以null结尾的,但字符数组是以null结尾的。这意味着,只要Interop指定该字符串应该作为Unicode进行编组,它就可以直接传递给非托管函数而无需涉及任何复制。


4
为了确保与COM的互操作性更加容易。

3
虽然长度字段使得框架轻松确定字符串的长度(并让字符串包含零值字符),但是有很多东西需要框架(或用户程序)处理,它们期望以NULL结尾的字符串。比如,像Win32 API一样。因此,在字符串数据末尾保留一个NULL终止符是很方便的,因为它经常需要出现在那里。请注意,C++的std::string类以相同的方式实现(至少在MSVC中)。基于同样的原因,我确信(c_str()经常用于将std::string传递给需要C风格字符串的函数)。

1
最好的猜测是找到长度是常数(O(1)),相比之下遍历它需要运行O(n)。

这就是在字符串前加上长度的原因。这并不是另外使用终止字符的理由。 - Daniel Hilgarth
1
@Daniel Hilgarth:为什么我没有复制其他答案。问题要求从双方的角度阐述原因。 - leppie
1
抱歉,我不理解你的评论 - 再来一次?问题是在问为什么要同时使用它们两个的推理,而不是单独使用其中一个的推理。 - Daniel Hilgarth
你说得对,但我认为问题是在问为什么同时使用两者。实际上只需要一个就足以确定字符串的长度。 - Yuck
是的,我在想为什么两者要一起并行使用,而不仅仅使用其中一个(特别是长度前缀)。 - prostynick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接