+ -
当前位置:首页 → 问答吧 → 一个关于List<string>的基本问题

一个关于List<string>的基本问题

时间:2011-12-09

来源:互联网

请看
string ss = new string('2', 4);
ss = "hh";
List<string> ls = new List<string>();
ls.Add(ss);
MessageBox.Show(ls[0]);
ss = "hh2";
MessageBox.Show(ls[0]);
两次show的结果都是hh,证明了容器list里面的实体和外面的ss不是同一个引用

若把string改成控件Butten
Button btn = new Button();
btn.Text = "haha";
List<Button> lsbtn = new List<Button>();
lsbtn.Add(btn);
MessageBox.Show(lsbtn[0].Text.ToString());
btn.Text = "haha2";
MessageBox.Show(lsbtn[0].Text.ToString());
两次show的结果不一样,证明了list里面的实体和外面的btn是一个引用

如果我要装入自己定义的类,情况也同Butten

请问:
List容器什么情况下装入外面对象的引用,什么时候装入外面对象的副本
我一直以为c#里面凡是要new才能用的对象,都像是C++里面的智能指针,但string却不是这样,能仔细说明下吗?

作者: falcomavin   发布时间: 2011-12-09

string,int...是特殊的引用类型,它的实例是只读的

作者: c02645   发布时间: 2011-12-09

作者: kingdom_0   发布时间: 2011-12-09

引用对象,声明后
堆栈上
其实是,变量名+指针,指针指到堆上的对象
堆栈上
值类型,是变量名+值

你修改引用对象,其实是修改,堆上的内容,任何地方修改变量,都是如此。
修改值类型,就直接修改堆栈上的值

但string类型是不可修改的,或者说,修改的时候,直接在堆栈上又分配了空间。
你之前的使用,是直接把内容放到了应用对象内部的。

可以认为string是值类型

作者: jiuhexuan   发布时间: 2011-12-09

我理解的有问题,看2楼吧

作者: jiuhexuan   发布时间: 2011-12-09

很简单,
c#中string对象是不可变,对string对象的赋值或操作都只是重新创建一个string对象。

作者: dalmeeme   发布时间: 2011-12-09

看看这个:http://www.cnblogs.com/tling091223/archive/2009/12/23/1630338.html

作者: tanghuawei   发布时间: 2011-12-09

good post ar

作者: cmk128   发布时间: 2011-12-09

相关阅读 更多