在《C#本质论》中看到
由于引用类型只复制数据的地址,因此两个变量可以引用相同数据。除此之外,利用其中一个变量来更改变量,也会更改另一个变量引用的数据。无论赋值还是方法调用,这一点都是成立的。换言之,在一个方法的内部修改引用类型的数据,在调用者那里也会发生同样的改动。就试着写了这些代码 string sa = "我操";
            string sb = sa;
            Console.WriteLine(sa);
            Console.WriteLine(sb);
            sa = "我操2012";
            Console.WriteLine(sa);
            Console.WriteLine(sb);
            Console.ReadLine();可是输出的是
我操
我操
我操2012
我操所以说最后一个并没有变成我操2012呀,是我理解错了吗?

解决方案 »

  1.   

    你没有理解错,但是string是一种很特殊的类型。虽然它是引用类型,但是很多默认行为看起来它更像值类型。
      

  2.   

    string是引用类型,所以最后一个才是“我操”,sb = sa这句话只是把sa引用的对象的地址,也就是“我操”的地址赋值给sb,sb保存了“我操”的地址之后,就没有第二个赋值语句改变sb引用的地址,所以输出sb当然是“我操”,sa = "我操2012";不会改变sb的内容,因为sa和sb是两个不同的引用变量,有不同的内存空间,所以你给sa赋值操作,对sb一点影响都没有,
      

  3.   

    事实上,string是只读的。这意味着
    string s = "a";
    s = "b";
    事实上是
    string s = "a";
    s = new string("b"); //你永远不能更改一个string,你的更改只是让它指向一个新的对象。
      

  4.   

    lz要学习引用类型;别拿string来举例,他是比较特殊的。
    正如cao版主所说, sa = "我操2012";//你给sa赋值只是让他指向一个新的对象。但是sb没变。
      

  5.   

    string 比较特别不能当作一般的引用类型来看,string是不可变的,意为着你每次新赋值会从新复制一份。
      

  6.   

    sa = "我操2012";
    又另外建立了一个对象吧
    跟sb已经不是同一个了
      

  7.   

    string  类型比较特殊啦,换其它类型试试!
      

  8.   

    String 是个特例, framework 内部对它进行了一些特殊处理。
    比如 两个字符串用+号相加,你知道是怎么+的么?弄清楚了这个问题也可以搞清楚。 
    你可以把两个Object用+号加起来咩。
      

  9.   

    字符串具有不可变性,给sa赋值是另给sa了开辟了一块区域
      

  10.   

    这个问题与string是否特殊没有任何关系
            public class String
            {
                private string value;
                public static implicit operator String(string value) { return new String { value = value }; }
                public override string ToString()
                {
                    return value;
                }
            }
                String sa = "我操";
                String sb = sa;
                Console.WriteLine(sa);
                Console.WriteLine(sb);
                sa = "我操2012";
                Console.WriteLine(sa);
                Console.WriteLine(sb);
                Console.ReadLine();
    关键的问题是楼主把 变量 与 变量的成员 搞混淆了。
      

  11.   

    sa改变后  要给sb重新赋值  sb才会改变  
                String sa = "我操";
                String sb = sa;
                Console.WriteLine(sa);
                Console.WriteLine(sb);
                sa = "我操2012";
                String sb = sa;
                Console.WriteLine(sa);
                Console.WriteLine(sb);
                Console.ReadLine();
    这样就行了