不变的字符串

时间:2018-06-20 05:38:31

标签: c# string stack heap

现在,对我来说,字符串一直是值类型。了解它们不是,实际上是所谓的不可变字符串很有趣,但是存在一个非常重要的问题:

什么时候字符串不是不可变字符串?

看,当我声明这样的字符串时:

string testString = "abc";

现在,堆栈应保存变量声明,堆应保存变量所引用的值。 如果我声明了第二个字符串:

string secondString = testString;

两个变量现在都应该引用堆上的相同位置。 如果我这样做:

secondString = testString + "def";

应该复制,修改堆上的值,并在堆上放置第二个值。

我知道这是不可变的字符串。

但是,由于这几乎就是我一直以来声明和使用字符串的方式,所以我想知道是否还有另一种方法,就是可变的字符串。

1 个答案:

答案 0 :(得分:1)

首先,字符串是不可变的,就是这样。

var string1 = "string";
var string2 = string1;
string2 = "string2";

Console.WriteLine(string1);
Console.WriteLine(string2);

输出

string
string2

第二,为什么您真的想要可变的字符串?字符串“不可变”的原因有很多。参见Why .NET String is immutable?

最后,如果您确实想要一个不可变的字符串,则可以创建StringBuilder的实例,以获取可变性,但是它会在需要时重新分配其内部缓冲区,或者您可以滚动自己的漂亮裤子类