我有以下代码:
public class Test
{
public static void Main()
{
List<Person> list = new List<Person>();
Person person = new Person() { Name="Chris" };
list.Add(person);
person = new Person(){ Name="Wilson the cat" };
list.Add(person);
Console.WriteLine(list[0].Name);
Console.WriteLine(list[1].Name);
Console.ReadLine();
}
}
public class Person
{
public string Name {get;set;}
}
我的问题是第一人称实例去了哪里? CLR是否在某处神奇地创建了它的新实例?无论如何在列表之外引用它 - 例如该方法完成后它在哪里?使用什么方法在集合中存储对象(这是4个问题)。
答案 0 :(得分:9)
List<Person> list = new List<Person>();
Person person = new Person() { Name="Chris" };
// your person object lives on the heap. The person variable is just
// a pointer of that object on the heap. Note that the pointer lives
// on the stack, and the object it points to lives on the heap.
list.Add(person);
// when you add your person to to the list, all it does it pass a
// copy of the *pointer* to the list's method. List has access to this
// object through the pointer.
person = new Person(){ Name="Wilson the cat" };
// new'ing up a instance of person creates another person object on
// the heap. Note that this doesn't overwrite our original person created above,
// because our original person sits in an entirely differently memory
// location.
// We did, however overwrite our pointer variable by assigning it a new
// location to point at. This doesn't affect the object we put into our
// list since the list received a copy of our original pointer :)
list.Add(person);
Console.WriteLine(list[0].Name);
// list[0] has a pointer to the first object we created
Console.WriteLine(list[1].Name);
// list[1] has a pointer to the second object we created.
Console.ReadLine();
// when this methods goes out of scope (i.e. when the stack frame is
// popped), the pointers will be dropped from memory, and the objects
// on the heap will no longer have any live references to them, so
// they'll be eaten by the garbage collector.
答案 1 :(得分:4)
1)它在堆上(或者如果&gt; 84K那么大对象堆)
2)是的,创建了一个新实例。可以通过列表访问它来引用它。
3)集合可能使用列表,但除非您需要特定的速度或空间属性,否则您不需要知道内部细节。