先上代码:
string b = "123"; private void Form1_Load(object sender, EventArgs e) { Test(b); MessageBox.Show(b); } public void Test(string a ) { a = "456"; }
string是引用类型的,应该按引用传递, 输出结果应该是:456,正确答案却是:123
string继承自object,而不是System.ValueType(Int32这样的则是继承于System.ValueType) 。string是引用类型,毋庸置疑,但是这个特殊的类却表现出值类型的特点.
Why?搜网上原文如下:string有个显著的特点就是它的不变性,我们一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。 string 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。有的时候看来似乎修改了,实际是string经过了特殊处理,每次改变值时都会建立一个新的string对象,变量会指向这个新的对象,而原来的还是指向原来的对象,所以不会改变。这也是string效率低下的原因。
string的不变,并非说string不能改变,而是其值不能改变。当b="123"其值发生改变时,这时检查内存,发现不存在此字符串,则重新分配内存空间,存储“456”,分配a的内存地址,a是局部的,稍后GC会自动释放,而b依然指向“123”的地址。
string 还有个特殊地方,就是它内存分配的问题,在例子中b="123",这时在内存中就将“123”存下来,假如如果再创建字符串对象,其值也等于“123”,c="123",则并非再重新分配内存空间,而是将之前保存的“123”的地址赋给c的引用。
string引用类型解惑