【问题标题】:String.Substring(): Copy, or Reference?String.Substring():复制还是引用?
【发布时间】:2012-02-24 15:48:05
【问题描述】:

当使用 SubString() 方法创建字符串时,生成的字符串是原始字符串元素的副本(因此现在有 2 个具有相同信息的内存位置)还是对现有内存的引用地点?

如果是副本,有没有办法让它成为参考?

【问题讨论】:

    标签: c# string reference


    【解决方案1】:

    这是一个副本,你不能有一个 string 引用另一个字符串的一部分。 .net 字符串不是由数组支持的,它包含内联的 char 数据。即它是一个可变长度的类,类似于数组。

    虽然子引用模型是一种可能的实现(我认为 java 字符串只是 char 数组的切片),但它可能会导致奇怪的行为,即保留一个小的子字符串将整个字符串保留在内存中,这是 java 的常见缺陷子串。我猜想.net 设计者想要避免这些问题。

    您可以使用自己的字符串类型,该类型具有此属性。例如,您可以使用 ArraySegment<char> 将切片处理成 char 数组。

    【讨论】:

      【解决方案2】:

      在 C# 中,字符串是不可变的*,但不是持久的。这意味着作为SubString 方法结果的新字符串不与旧字符串共享公共部分。 Here 是 Eric Lippert 的精彩解释。

      * 对字符串的操作将返回新的字符串对象

      【讨论】:

        【解决方案3】:

        这是一个新字符串。你可以敲出一些东西,说保持其他字符串的开始和结束位置,例如,如果你调用它,你将发送到子字符串的参数。 如果它是一个固定的模式(或者至少可以在一个已知的时间间隔内固定,你可以提前把它切碎,或者使用 StringBuilder,或者带有 TextReader 的 Stream。

        我会说如果子字符串在具有不可变字符串的 llanguage 中是一个问题,您应该设计出对它的需求。它很方便,但应该是一次性的。

        【讨论】:

          猜你喜欢
          • 2015-04-12
          • 1970-01-01
          • 2016-02-26
          • 2019-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-11
          相关资源
          最近更新 更多