String.Substring():复制或引用

本文关键字:复制 引用 Substring String | 更新日期: 2023-09-27 18:22:05

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

如果是副本,有没有办法将其作为参考?

String.Substring():复制或引用

在C#中,字符串是不可变的*,但不是持久的。这意味着作为SubString方法的结果的新字符串不与旧字符串共享公共部分。以下是埃里克·利珀特的精彩解释。

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

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

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

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

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

我想说,如果子字符串是不可变字符串语言中的一个问题,你应该设计出它的需求。它很方便,但应该是一次性的。