http://www.21cnvip.net/TopicView/list5748512.html

解决方案 »

  1.   

    修改其中一个字符串,这会创建一个全新的string对象,而另一个字符串没有改变现在对这个问题我自己似乎也有所理解。但是有一点不解,为什么字符串是要这样子做呢?即不可修改,而且每次多创建一个新的字符串拷贝。他的不可修改难道是因为是属于引用类型吗?其它用类创建的引用类型也能修改其值?难道是?
      

  2.   

    之前学习PHP的时候,如果要引用字符串可以这样$a = "test";
    $b = &$a;但是,C#当中,字符串是引用类型的,但表现出来的确更像是值类型的。那如果让字符串表现出像引用类型呢?
      

  3.   

    不管string是引用类型还是值类型,lz给的例子结果都应该是test。C#当中,字符串是引用类型的,但表现出来的确更像是值类型的
    确实是这样,就这样理解也没错。
      

  4.   

    这确与我们期待的引用类型正好相反。当用值"test";初始化a时,就在堆上分配了一个string对象。
    在用a初始化b时,引用也指向这个对象,所以b的值也是"test"。
    但是当用" "要改变b的值时,他不是替换原来堆地址的值,而是在堆上就会为新值分配一个新对象。
    而a变量仍指向原来的对象,所以它的值没有改变。基本上,string类实现为其语义遵循一般的、直观的字符串规则。
     
      

  5.   

    string a = "test";  //这里声明变量并给变量赋值。在内存中分配一个空间来存储变量
    string b = a;       //这里也是给变量分配空间并把变量a复制给b
    b = " ";           //在内存中另外分配空间来存放变量b           
      

  6.   

    也就是说string在赋值的时候,并不是在原来的地址上更改,而是重新分配一块内存,这时str1已和str2所对应的内存已经不同了
      

  7.   

    string a="test",a指向的是test在内存中的地址;
    string b=a,把a的值赋给b,实际上b和a指向test;
    b=" ",b指向了空的地址,b的值改变了而a的值没有改变,a仍然指向test地址。