我有一些关于字符串引用类型或值类型的困惑,我有两个变量的字符串类型,我赋值给第一个变量,然后分配相同的变量,第二个变量,如果我改变任何东西第一个变量值没有得到第二个变量的变化,因为第二个变量也指向第一个变量的相同位置?字符串是值类型还是引用类型?
string string1 = "abc";
string string2 = string1;
string1 = "xyz";
这里STRING1持有价值XYZ 1和字符串是ABC
我有一些关于字符串引用类型或值类型的困惑,我有两个变量的字符串类型,我赋值给第一个变量,然后分配相同的变量,第二个变量,如果我改变任何东西第一个变量值没有得到第二个变量的变化,因为第二个变量也指向第一个变量的相同位置?字符串是值类型还是引用类型?
string string1 = "abc";
string string2 = string1;
string1 = "xyz";
这里STRING1持有价值XYZ 1和字符串是ABC
这里的是怎么回事:
string string1 = "abc";
string1
是参考字符串 “ABC”,它生活在堆某处。
string string2 = string1;
string2
是另一种参考,那恰好指向同一个地方在内存中string1
。当您使用赋值运算符时,该引用被复制到string2
。您现在有两个变量指向内存中的相同位置。
string1 = "xyz";
string1
现在指向包含 “XYZ” 的新创建字符串。 string2
仍然指向“abc”,仍然是可达并且不会被垃圾收集。
无论如何,是的;字符串是一个引用类型。
,但如何在这个stringbuilder不同于字符串案件? – 2014-09-02 23:42:58
由于'StringBuilder'的构建方式不同,其行为与'string'不同。 'StringBuilder'有不同的用途;它包含突变方法,并允许您建立一个字符串,而不会产生不断创建新字符串的代价。 – 2014-09-02 23:44:22
'StringBuilder'针对通过串联构建字符串进行了优化。如果你用'System.String'完成了这个操作,它将不得不一次又一次地重新分配内存,因为字符串是不可变的。 – 2014-09-02 23:46:10
这是一个类,所以它是一个引用类型。它也是不可变的。 – 2014-09-02 23:33:07
@JeroenVannevel但为什么这两个变量都没有保存xyz值? – 2014-09-02 23:34:23
它甚至不重要,它是不可变的。在这里,您只是将另一个引用放入名为'string1'的变量中,您实际上并未修改任何内容。 – Jon 2014-09-02 23:34:26