【问题标题】:Why are C#/.Net strings length-prefixed and null terminated?为什么 C#/.Net 字符串以长度为前缀并以 null 结尾?
【发布时间】:2011-09-11 17:10:39
【问题描述】:

在阅读了What's the rationale for null terminated strings? 和一些类似的问题后,我发现在 C#/.Net 中,字符串在内部都是以长度为前缀和以空结尾的,就像在BSTR Data Type 中一样。

字符串以长度为前缀并以空字符结尾而不是例如字符串的原因是什么?只有长度前缀?

【问题讨论】:

  • 可能只有@Eric Lippert 能够回答这个问题。做其中一个或另一个(以及权衡)有充分的理由。我和你一样惊讶于 C#both

标签: c# .net string bstr null-terminated


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    例如 Win32 API。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这就是在字符串前面加上长度的原因。这不是额外使用终止字符的原因
        • @Daniel Hilgarth:以及为什么我没有复制其他答案。问题问双方的推理。
        • 对不起,我不明白你的评论 - 再来一次?这些问题询问一起使用的原因是什么。而不是其中一个或另一个的推理是什么
        • 你是对的,但我认为问题是问为什么 both 同时使用。实际上只需要一个或另一个来确定字符串长度。
        • 是的,我想知道为什么两者同时使用,而不仅仅是其中一个(特别是 - 长度前缀)。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2015-08-08
          • 1970-01-01
          • 2011-11-05
          • 2012-06-12
          • 2019-10-28
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多