2016-05-18 2 views
1

У меня есть следующий класс:Как выделяется память при создании свойства класса?

public class A 
{ 
    public List<string> AList { get; set; } 
} 

Затем я создаю объект класса:

A objectA = new A(); 
objectA.AList = new List<string>() { "1", "2", "3" }; 

Мой вопрос как память будет выделяться в куче? То есть будет objectA.AList выделено внутри objectA (image1) или в качестве отдельного объекта в куче (image2)

image1:

enter image description here

image2:

enter image description here

+3

Учтите, что ваш вызов 'New List ' может быть в любой момент времени - он может быть в другой функции и может быть вызван задолго до или после вашего вызова на 'new A()' и сохранен в любое число промежуточных переменных. Как вы ожидаете, что среда выполнения предскажет будущее и узнает, что она будет * в конечном итоге назначена на свойство 'AList' определенного объекта' A'? –

+0

@Damien_The_Unbeliever, следовательно, ответ «Image2»? – StepUp

ответ

2

Правильный ответ: Изображение 3.

I ' m не собираюсь рисовать это, но ваш пример приводит к 5 объектам в куче.

объекты (экземпляры) не имеют имен, но они упоминаются в следующих ссылках:

  1. Objecta
  2. objectA.AList
  3. objectA.AList [0]
  4. Objecta. ALIST [1]
  5. objectA.AList [2]

Каждая строка ALS o объект сам по себе.

Экземпляр objectA содержит только ссылку на Список, а в списке хранится массив ссылок на строки. 3, больше может быть выделено и по-прежнему будет null.

Ни один из этих объектов не живет «внутри» другого.