2

次のコードがあります。

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 つの質問でした)。

4

2 に答える 2

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.
于 2009-01-26T00:27:50.500 に答える
4

1)ヒープ(または84Kを超える場合は大きなオブジェクトヒープ)に移動します

2) はい、新しいインスタンスが作成されます。リストからアクセスすることで参照できます。

3) コレクションはおそらくリストを使用しますが、特定の速度またはスペース プロパティが必要でない限り、内部の詳細を知る必要はありません。

于 2009-01-26T00:17:30.397 に答える