2014-09-02 48 views
-1

我有一些关于字符串引用类型或值类型的困惑,我有两个变量的字符串类型,我赋值给第一个变量,然后分配相同的变量,第二个变量,如果我改变任何东西第一个变量值没有得到第二个变量的变化,因为第二个变量也指向第一个变量的相同位置?字符串是值类型还是引用类型?

 string string1 = "abc"; 

     string string2 = string1; 

     string1 = "xyz"; 

这里STRING1持有价值XYZ 1和字符串是ABC

+1

这是一个类,所以它是一个引用类型。它也是不可变的。 – 2014-09-02 23:33:07

+0

@JeroenVannevel但为什么这两个变量都没有保存xyz值? – 2014-09-02 23:34:23

+0

它甚至不重要,它是不可变的。在这里,您只是将另一个引用放入名为'string1'的变量中,您实际上并未修改任何内容。 – Jon 2014-09-02 23:34:26

回答

4

这里的是怎么回事:

string string1 = "abc"; 

string1参考字符串 “ABC”,它生活在堆某处。

string string2 = string1; 

string2是另一种参考,那恰好指向同一个地方在内存中string1。当您使用赋值运算符时,该引用被复制到string2。您现在有两个变量指向内存中的相同位置。

string1 = "xyz"; 

string1现在指向包含 “XYZ” 的新创建字符串。 string2仍然指向“abc”,仍然是可达并且不会被垃圾收集。

无论如何,是的;字符串是一个引用类型。

+0

,但如何在这个stringbuilder不同于字符串案件? – 2014-09-02 23:42:58

+1

由于'StringBuilder'的构建方式不同,其行为与'string'不同。 'StringBuilder'有不同的用途;它包含突变方法,并允许您建立一个字符串,而不会产生不断创建新字符串的代价。 – 2014-09-02 23:44:22

+1

'StringBuilder'针对通过串联构建字符串进行了优化。如果你用'System.String'完成了这个操作,它将不得不一次又一次地重新分配内存,因为字符串是不可变的。 – 2014-09-02 23:46:10

相关问题