Добавить список объектов к себе? - PullRequest
0 голосов
/ 02 июня 2018

Мне было интересно, что произойдет, если я добавлю список к себе.Возможно переполнение стека, может быть ошибка компилятора?

List<object> lstobj = new List<object>();
lstobj.Add(lstobj);

Итак, я выполнил код и проверил локальные переменные:

Local Variables

Список содержит бесконечное количество экземпляров списка.Почему нет переполнения стека?Являются ли списки только указателями на исходный список?Но даже если списки являются просто указателями, не занимают ли указатели также память?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Определение выглядит следующим образом:

Line 1) object[] arr = new object[4];
Line 2) arr[0] = arr;

arr[0] теперь является другим псевдонимом для arr, и оба значения arr и arr[0] имеют то же значение, что и адрес данных массива.

Состояние памяти может быть, например, следующим:

После строки 1:

Address Value
@100:   104    // arr variable
@104:   0      // cell[0] of array data
@108:   0      // cell[1] of array data
@112:   0      // cell[2] of array data
@116:   0      // cell[3] of array data

После строки 2:

Address Value
@100:   104    // arr variable
@104:   104    // cell[0] of array data
@108:   0      // cell[1] of array data
@112:   0      // cell[2] of array data
@116:   0      // cell[3] of array data
0 голосов
/ 02 июня 2018

Это не будет проблемой.Список является ссылочным типом, то есть вы получите ссылку на список внутри себя (именно то, что вы показали).

То, что вы видите (эта большая иерархия), есть только в Visual Studio.Реальная ситуация в том, что вы просто получаете ссылку на адрес памяти этого массива внутри того же адреса памяти того же массива.Таким образом, вы получаете переполнение стека.

Вы увидите, что много в свойствах навигации при использовании Entity Framework.

Это будет проблемой, если вы попытаетесь сериализовать список без настройки сериализатора назнать при сериализации циклических ссылок.

...