黑马程序员技术交流社区

标题: string是引用类型,那大家帮忙看看这段代码 [打印本页]

作者: 经睿    时间: 2011-11-10 10:08
标题: string是引用类型,那大家帮忙看看这段代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace StringTest
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             string str01 = "hello,world!";
  12.             string str02 = str01;
  13.             char[] char01 = str01.ToCharArray();
  14.             char01[1] = 'i';
  15.             str01 = new string(char01);
  16.             Console.WriteLine("字符串01为{0}{1}字符串02为{2}", str01, Environment.NewLine, str02);
  17.             Console.ReadKey();
  18.         }
  19.     }
  20. }
复制代码
为何str01改变之后str02不变?
作者: 吴春晟    时间: 2011-11-10 10:35
有个贴子问的是类似问题,
我引用下 郑文的回复;

http://bbs.itheima.com/forum.php?mod=redirect&goto=findpost&ptid=2765&pid=17428&fromuid=2783

作者: 吴春晟    时间: 2011-11-10 10:37
引用错误了,应该是

王金凤的回答

为了提高性能和保证执行效率,.NET Framework维护了一个字符串池,也称为“暂存池”或“常量池”,用以对使用过的字符串进行缓存。所以s2的值并没有改变

作者: 经睿    时间: 2011-11-10 10:50
本帖最后由 经睿 于 2011-11-10 12:19 编辑

给一个字符串变量赋值的时候,在内存中就给这个字符串分配了空间。当给这个字符串变量赋另一个值的时候,内存中又为另一个字符串分配了空间,但并没有覆盖原先那个字符串,只是将该字符串变量指向给新的字符串地址。所以str02还是能指向原先的"hello,world!",因为"hello,world!"这个字符串在内存中并没有被"hillo,world!"覆盖。这是由于字符串的不可改变性。
作者: 周大俊    时间: 2011-11-15 14:53
String是引用类型不错,但是你这段代码中,只是对string1的引用做了改变,虽然string2的值是通过string1赋予的,但string1与string2本质上是两个不同(他们都各自分配了不同的存储空间)的字符串。
作者: 付炯    时间: 2011-11-15 17:36
程序执行了这样的过程
string str02 = str01;  //将str01指向的内存空间赋予str02
str01 = new string(char01);  //使用new关键字为str01赋予了新的指向
而此时str02还指向str01原来指向的内存位置 所以str01改变了 而str02仍旧不变
作者: 张振鹏    时间: 2011-11-15 18:13
string str02 = str01;是将str01的指向赋给了str02,执行之后str01和str02都指向统一内存空间
str01 = new string(char01);  new了一个新指向并把它赋给str01,这是str01的指向就不是"hello word"而是"i"所处的内存空间
执行完毕之后str01指向了新的内存空间,而str02值得还是原来的内存空间,因此str01改变str02不变
作者: 毕山山    时间: 2011-11-16 17:14
本帖最后由 毕山山 于 2011-11-16 17:17 编辑

由于字符串的不可变性
string str01 = "hello,world!";
string str02 = str01;                       
//str02和str01都指向 "hello,world!"  注意不是str02指向str01, 而是str02指向str01指向的对象.
str01 = new string(char01);            
//首先查找new string(char01)在常量池中是否存在,因为你改变了"hello,world!",所以没查到,这样会另外创建一块内存放new string(char01),这样str01就指向了new string(char01)而str02还是指向 "hello,world!". 所以str01指向的内容变了而str02指向的内容没变.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2