现在,对我来说,字符串一直是值类型。了解它们不是,实际上是所谓的不可变字符串很有趣,但是存在一个非常重要的问题:
什么时候字符串不是不可变字符串?
看,当我声明这样的字符串时:
string testString = "abc";
现在,堆栈应保存变量声明,堆应保存变量所引用的值。 如果我声明了第二个字符串:
string secondString = testString;
两个变量现在都应该引用堆上的相同位置。 如果我这样做:
secondString = testString + "def";
应该复制,修改堆上的值,并在堆上放置第二个值。
我知道这是不可变的字符串。
但是,由于这几乎就是我一直以来声明和使用字符串的方式,所以我想知道是否还有另一种方法,就是可变的字符串。
答案 0 :(得分:1)
首先,字符串是不可变的,就是这样。
var string1 = "string";
var string2 = string1;
string2 = "string2";
Console.WriteLine(string1);
Console.WriteLine(string2);
输出
string string2
第二,为什么您真的想要可变的字符串?字符串“不可变”的原因有很多。参见Why .NET String is immutable?
最后,如果您确实想要一个不可变的字符串,则可以创建StringBuilder
的实例,以获取可变性,但是它会在需要时重新分配其内部缓冲区,或者您可以滚动自己的漂亮裤子类