list<string>.add(string)是传的值还是传的地址String
解决方案 »
- C#SerialPort如何用接收事件接收数据包为32个的数据
- 想用C#做一个钢琴,但是苦于没有do、re、mi、fa这些音的MP3,如何获取这些音频,或是相关的接口
- Microsoft.WindowsMobile.Telephony.Phone 是什么类库里面
- TabStrip+MultiPage实现切换,重画DataGrid导致失效
- 求助视频聊天的资料
- SQL Server不存在或拒绝被访问
- 请各位大侠帮助解答下面的三个问题
- 一个关于foreach的问题
- tableLayoutPanel的列能否控制可视不可视?
- 如何实现一个树形结构?
- WPF,Blend设计ListBox模板的问题
- 一个简单得吓死你的问题。
你可以看看这篇文章:
http://blog.csdn.net/masterft/article/details/1727151
new一个list是在内存开辟了新 的空间,引用地址指向新的空间。
而所有的值类型,包括预定义的各种数值类型,枚举类型以及Struct声明的类型,当成函数参数时,传的都是值,函数内对值或Struct的属性的修改,都无法反映到函数的调用者的scope中。
看下这内部实现就知道,根据T的类型来决定的,如果是传人的值类型,当然就是传值,引用类型就是传递的地址,但是string是一个特殊的情况,它是引用类型,但是传递后给方法后是一个新的string,在方法内部改变后,它之前的值却是不受影响的,这就会造成值类型的一个假象。
string sample="0";
for(i=0;i<10;i++){list<string>.add(sample)
}
sample.clear();
list中的值还有吗?
这里的string清空了,list中还是有值的
但是其他的引用类型 值改变了 list中的值也是会变的
例:
public class AAAAA
{
public int AAA { get; set; }
}
class Program
{
static void Main(string[] args)
{
AAAAA a = new AAAAA();
a.AAA = 111;
List<AAAAA> list = new List<AAAAA>();
for (int i = 0; i < 10; i++)
{
list.Add(a);
}
a.AAA = 222;
for (int i = 0; i < 10; i++)
{
Console.WriteLine(list[i].AAA);
}
Console.ReadKey();
}
}