string c = "aa";
string d = c;
d = "dd";
Console.WriteLine("c:{0} d:{1}", c, d);结果 c:aa d:ddCircle cc = new Circle(42);
Circle dd = cc;
dd.f = 43;
Console.WriteLine(cc.f + "_" + dd.f); 结果 43_43string是引用数据类型,因此字符串c的值“aa”存放在堆中,后面定义了字符串d,并将字符串c的引用地址传给了字符串d,因此字符串c和字符串d都指向了值“aa”,而此时修改字符串d的值为“dd”,按说字符串c和字符串d都是指向堆中同一片区域(这个根据上面的例子2得出的),此时修改了字符串d的值,而字符串c和字符串d的引用地址指向是一样的,那为什么会出现字符串c和字符串d的值不同?如果说字符串c和字符串d的引用地址发生了改变,那例子二中的引用地址为何没有改变?c#

解决方案 »

  1.   

    string的赋值操作被重构为“copy”而不是引用。当你满脑子底层概念而无法自拔时,也许无法去较早接收高层次的信息了。
      

  2.   


    那引用类型什么样的情况下做的“copy”操作,而什么样的情况下做到是引用操作了?
      

  3.   

    string c = "aa";
    string d = c;
    d = "dd";
    Console.WriteLine("c:{0} d:{1}", c, d);d = "dd";你觉得是 *d = "dd";
    实际上是
    *d = &new string("dd");
    //以上语法只是为了说明问题,非实际代码。
      

  4.   


    不太懂你说的这个,你上面说的意思是d创建了对象,那我下面写的这段代码还是和上面的结果一样
    string c = "aa";
    string d = c;
    d = "bb";
    string e = d;
    e = "ff";
    Console.WriteLine("c:{0} d:{1} e:{2}", c, d,e);
    结果:c:aa  d:bb  e:ff
      

  5.   

    是啊e = "ff";
    你以为是让e指向的引用变成了ff,事实上是,创建了一个新的字符串对象,值是ff,然后让e指向它。所以d的值不变。
      

  6.   

    估计你的Circle是结构struct,结构不是引用类型,会复制数据,因此cc、dd已经是不同的对象
      

  7.   

    把string这个类型放到引用类型和值类型外吧,它虽然是引用类型,但是很特殊