昨天发了一个贴,越讨论越乱,今天重新发一下,重新说明一下
昨天的贴
http://topic.csdn.net/u/20110630/15/961fbae8-32fe-4f35-9012-3f29fe70eaab.html我认为student1和student2都指向了内存中的同一个数据,所以最后输出的都是“123”,结果也得到了证实
Student student1 = new Student();
student1.name = "ASDF";
Student student2 = student1;
student2.name = "123";按道理List也是引用类型,a和b都是指针,指向了同一个数据“hello”,但是运行结果却和上面student不一样
最后,b是null,a却还有值“hello”
List<string> a = new List<string>();
a.Add("hello");
List<string> b = a;
 b = null;所以我的问题是一个普通的student类和List有什么区别吗?大家都是引用类型阿?
           
            

解决方案 »

  1.   

    我试了一下,student2=null;不会影响student1 
    所以你的例子:
    b = null;   与
    student2.name = "123";
    是不对等的话说C#的引用类型确实好用但不好懂,还是C语言的直白
      

  2.   

    貌似是 b = null;只会使b指向了null,
    但是,实际上,b之前所指向的“对象”并未改变或消失,
    它在没有被任何“东西”指向时,才等待垃圾收集器来释放
      

  3.   

    楼上说的没错
    List<string> b = a;
    是把a的引用给了b,让b和a指向同一个内存。
    而你再b=null;
    就是把b的引用又置空了,和a没关系。而你前面说的student的问题,因为student1的引用给了student2,他们指向同一内存区,你修改该内存区里的属性name,当然两个student都影响了
      

  4.   

    List<string> a = new List<string>();   //在地址
    a.Add("hello");
    List<string> b = a;
     b = null;a.Add("hello");
    这个值就跟List<string> a = new List<string>();这个存储的内存空间一样,一个栈区,一个是堆区。
    List<string> b = a; 这里是应用a地址 
     b = null; 把自己的值改变了,并没有改变a.Add("hello"); 那时候时候赋的值;因为内存空间不一样。所以最后得出的结果给你问题说的那样。。