String.Substring():复制还是引用?

时间:2012-02-01 23:03:39

标签: c# string reference

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

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

我会说如果substring是一个带有不可变字符串的llanguage中的问题,你应该设计出它的必要性。它很方便,但它应该是一次性的。