20

阅读空终止字符串的基本原理是什么?以及一些类似的问题,我发现在 C#/.Net 中,字符串在内部都是以长度为前缀和以空结尾的,就像在BSTR Data Type中一样。

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

4

5 回答 5

21

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

Null 终止以使编组到非托管的极快(非托管可能需要以空结尾的字符串)。

于 2011-06-09T13:35:07.193 回答
12

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

尽管就 API 而言字符串不是以空值结尾的,但字符数组是以空值结尾的,因为这意味着它可以直接传递给非托管函数而无需涉及任何复制,假设互操作指定字符串应编组为 Unicode。

于 2011-06-09T13:33:45.820 回答
4

很可能是为了确保与 COM 的轻松互操作性。

于 2011-06-09T13:31:29.310 回答
3

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

例如,像 Win32 API。

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

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

于 2011-06-09T13:44:27.363 回答
1

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

于 2011-06-09T13:34:24.457 回答