string对象是引用类型,楼主的代码,其实相当于下面的意思://以下是示意性代码:
string s1 = new string("nihao");
string s2 = s1;
string s2 = new string("33");所以string s2 = "33";是把一个新的string对象赋值给s2了,s1当然不会改变,只不过上面的这种写法太麻烦,所以C#提供了简单的写法,可以写成:string s1="nihao";
string s2=s1;
s2="33";
string s1 = new string("nihao");
string s2 = s1;
string s2 = new string("33");所以string s2 = "33";是把一个新的string对象赋值给s2了,s1当然不会改变,只不过上面的这种写法太麻烦,所以C#提供了简单的写法,可以写成:string s1="nihao";
string s2=s1;
s2="33";
2.因为数组是引用类型。
public int i;
}Test t1 = new Test();
Test t2 = t1;
t1.i *= 2;这样的话 t1还是等于t2啊,和它里面的int变量没有关系呀。数组也是这样。所有的引用类型里,只有String是比较特殊的,这是因为string的赋值语句其实是new出了一个新的string类例,而不是改变原来对象的值的缘故。@winxieddd(一剑飘香)
c#里的string就是System.String类型,确实是引用类型。只是因为它的赋值语句的特殊语义,让它看上去像一个值类型。
aaa----->bbb---->"ccc"
所以,bbb的值如果变了,而且是用了new ,那么aaa既然引用bbb,为何aaa的值不变?如果说此时的aaa引用的是原来的bbb的话,那么既然现在bbb都重新改头换面了,或者说因为bbb的new,可以说bbb没有了,那么为何aaa还有一个和原来bbb一样的值呢?此时的aaa引用的是谁呢?空气?谢谢
_________________________________________________________________________
aaa相当于一个指针,存放着对象的首地址,地址指向对象所在的内存空间,bbb也一样
bbb=new以后,改变了bbb本身的值,实在令一块内存空间新建了一个对象,与原来的bbb不相干,此时aaa仍指向原来bbb的对象,所以没有改变,bbb指向了新对象,所以值改变了如果说此时的aaa引用的是原来的bbb的话,那么既然现在bbb都重新改头换面了,或者说因为bbb的new,可以说bbb没有了
——————————————
原来的bbb还有,并不是没有了,原来bbb的内存空间没有被释放,仅仅是新建了一个对象
,那么为何aaa还有一个和原来bbb一样的值呢?此时的aaa引用的是谁呢?空气?
——————————————————————————————
是原来的bbb对象
string a= new string("abc");
string b = new string(a);
a= new string("def");这样就可以看出来b不会改变了。那为什么其他的对象类型就必须new了呢?因为: 这个是编译器规定的,属于特例。
你对引用类型的理解有问题,引用类型并不是像线一样穿在一起的。在你那个例子里,不仅bbb变了aaa会跟着改变,aaa变了bbb也会跟着改变,所以其实是aaa和bbb像两根针一样指着同一块内存地址:aaa----> "ccc" <----bbb如果我们通过aaa改变"ccc"的内容,再用bbb读出它所指的内容,当然也会改变,反之亦然。 然而对于string来说有点特殊。如果我们写bbb= "ddd",这个时候并不是把原来"ccc"的内容,改成"ddd",而是申请了一块新的内存,放入"ddd",然后让bbb指向它,所以这个时候内存里就变成这样:aaa--->"ccc" bbb--->"ddd"所以aaa和bbb就不同了,这样说你明白了吗?
aaa该为"ccc"了,同为引用类型,那么数组情况下,为何bbb会跟着aaa的改变而改变呢?