在阅读了What's the rationale for null terminated strings?和一些类似的问题后,我发现在C#/.NET中字符串内部既是带长度前缀又是以空字符结尾,就像BSTR数据类型一样。为什么字符串既要带长度前缀又要以空字符结尾而不是只带长度前缀呢?
添加长度前缀以使计算长度的时间复杂度为O(1)
。
以空字符结尾以进行编组到非托管代码的快速处理(非托管代码通常期望以空字符结尾的字符串)。
这是Jon Skeet关于字符串的博客文章Post的摘录:
尽管从API的角度来看,字符串并不是以null结尾的,但字符数组是以null结尾的。这意味着,只要Interop指定该字符串应该作为Unicode进行编组,它就可以直接传递给非托管函数而无需涉及任何复制。