不可变字符串
Immutable Strings
现在,对我来说,字符串一直是值类型。了解它们不是,实际上是所谓的不可变字符串非常有趣,但有一个非常重要的问题:
什么时候字符串不是不可变字符串?
看,当我这样声明一个字符串时:
string testString = "abc";
堆栈现在应该保存变量声明,堆保存变量引用的值。
如果我声明第二个字符串:
string secondString = testString;
两个变量现在应该引用堆上的相同位置。
如果我这样做:
secondString = testString + "def";
应该复制、修改堆上的值,并且第二个值应该位于堆上。
我明白这就是不可变字符串。
但由于这几乎是我一直声明和使用字符串的方式,我想知道是否有另一种方法,可以说是可变字符串。
首先,字符串是不可变的,仅此而已。
var string1 = "string";
var string2 = string1;
string2 = "string2";
Console.WriteLine(string1);
Console.WriteLine(string2);
输出
string
string2
其次,你为什么真的想要一个可变字符串?字符串 "are" 不可变的原因有很多。见 Why .NET String is immutable?
最后,如果你真的想要一个不可变的字符串,你可以创建一个实例裤子 class.
现在,对我来说,字符串一直是值类型。了解它们不是,实际上是所谓的不可变字符串非常有趣,但有一个非常重要的问题:
什么时候字符串不是不可变字符串?
看,当我这样声明一个字符串时:
string testString = "abc";
堆栈现在应该保存变量声明,堆保存变量引用的值。 如果我声明第二个字符串:
string secondString = testString;
两个变量现在应该引用堆上的相同位置。 如果我这样做:
secondString = testString + "def";
应该复制、修改堆上的值,并且第二个值应该位于堆上。
我明白这就是不可变字符串。
但由于这几乎是我一直声明和使用字符串的方式,我想知道是否有另一种方法,可以说是可变字符串。
首先,字符串是不可变的,仅此而已。
var string1 = "string";
var string2 = string1;
string2 = "string2";
Console.WriteLine(string1);
Console.WriteLine(string2);
输出
string string2
其次,你为什么真的想要一个可变字符串?字符串 "are" 不可变的原因有很多。见 Why .NET String is immutable?
最后,如果你真的想要一个不可变的字符串,你可以创建一个实例裤子 class.