string是一个特殊的类型 这里的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(); } }
你可以看看这篇文章:
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();
}
}