【发布时间】:2012-02-24 15:48:05
【问题描述】:
当使用 SubString() 方法创建字符串时,生成的字符串是原始字符串元素的副本(因此现在有 2 个具有相同信息的内存位置)还是对现有内存的引用地点?
如果是副本,有没有办法让它成为参考?
【问题讨论】:
当使用 SubString() 方法创建字符串时,生成的字符串是原始字符串元素的副本(因此现在有 2 个具有相同信息的内存位置)还是对现有内存的引用地点?
如果是副本,有没有办法让它成为参考?
【问题讨论】:
这是一个副本,你不能有一个 string 引用另一个字符串的一部分。 .net 字符串不是由数组支持的,它包含内联的 char 数据。即它是一个可变长度的类,类似于数组。
虽然子引用模型是一种可能的实现(我认为 java 字符串只是 char 数组的切片),但它可能会导致奇怪的行为,即保留一个小的子字符串将整个字符串保留在内存中,这是 java 的常见缺陷子串。我猜想.net 设计者想要避免这些问题。
您可以使用自己的字符串类型,该类型具有此属性。例如,您可以使用 ArraySegment<char> 将切片处理成 char 数组。
【讨论】:
在 C# 中,字符串是不可变的*,但不是持久的。这意味着作为SubString 方法结果的新字符串不与旧字符串共享公共部分。 Here 是 Eric Lippert 的精彩解释。
* 对字符串的操作将返回新的字符串对象
【讨论】:
这是一个新字符串。你可以敲出一些东西,说保持其他字符串的开始和结束位置,例如,如果你调用它,你将发送到子字符串的参数。 如果它是一个固定的模式(或者至少可以在一个已知的时间间隔内固定,你可以提前把它切碎,或者使用 StringBuilder,或者带有 TextReader 的 Stream。
我会说如果子字符串在具有不可变字符串的 llanguage 中是一个问题,您应该设计出对它的需求。它很方便,但应该是一次性的。
【讨论】: