A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 经睿 黑马帝   /  2011-11-10 10:08  /  2682 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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不变?

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

7 个回复

正序浏览
毕山山 黑马帝 2011-11-16 17:14:29
8#
本帖最后由 毕山山 于 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指向的内容没变.

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
张振鹏 黑马帝 2011-11-15 18:13:06
7#
string str02 = str01;是将str01的指向赋给了str02,执行之后str01和str02都指向统一内存空间
str01 = new string(char01);  new了一个新指向并把它赋给str01,这是str01的指向就不是"hello word"而是"i"所处的内存空间
执行完毕之后str01指向了新的内存空间,而str02值得还是原来的内存空间,因此str01改变str02不变

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
付炯 黑马帝 2011-11-15 17:36:29
地板
程序执行了这样的过程
string str02 = str01;  //将str01指向的内存空间赋予str02
str01 = new string(char01);  //使用new关键字为str01赋予了新的指向
而此时str02还指向str01原来指向的内存位置 所以str01改变了 而str02仍旧不变

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
String是引用类型不错,但是你这段代码中,只是对string1的引用做了改变,虽然string2的值是通过string1赋予的,但string1与string2本质上是两个不同(他们都各自分配了不同的存储空间)的字符串。

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
经睿 黑马帝 2011-11-10 10:50:20
板凳
本帖最后由 经睿 于 2011-11-10 12:19 编辑

给一个字符串变量赋值的时候,在内存中就给这个字符串分配了空间。当给这个字符串变量赋另一个值的时候,内存中又为另一个字符串分配了空间,但并没有覆盖原先那个字符串,只是将该字符串变量指向给新的字符串地址。所以str02还是能指向原先的"hello,world!",因为"hello,world!"这个字符串在内存中并没有被"hillo,world!"覆盖。这是由于字符串的不可改变性。

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
引用错误了,应该是

王金凤的回答

为了提高性能和保证执行效率,.NET Framework维护了一个字符串池,也称为“暂存池”或“常量池”,用以对使用过的字符串进行缓存。所以s2的值并没有改变
回复 使用道具 举报
有个贴子问的是类似问题,
我引用下 郑文的回复;

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

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马