Как C # Array работает с памятью? - PullRequest
0 голосов
/ 17 декабря 2018

Массив в C # - это просто блок непрерывной памяти, как и любой другой язык.По умолчанию взятие элемента по индексу в T[] будет стоить нам O (1) из-за вычисления index * sizeof(T).Но это будет работать, только если мы знаем sizeof(T).

Так что я попытался сломать его:

var sampleArray = new string[10];
sampleArray[0] = "1";
sampleArray[1] = "2";

var objectArray = (object[]) sampleArray;
objectArray[2] = 42;

И, как и ожидалось, получил время выполнения System.ArrayTypeMismatchException.

Хорошо,но сегодня я нашел этот пример:

var arr = new[] { new object[] { new[] { 1 }, 2, "3" } };
var someValue = arr[0][1];

И этот пример скомпилирован и запущен без каких-либо исключений.

Почему?

Как массив объектов знает размер любого элементаесли элементы разные?

Как это работает для строк различной длины на низком уровне?

Я не думаю, что Array хранит мета-информацию для каждого элемента ...А может я ошибся?

1 Ответ

0 голосов
/ 17 декабря 2018

string и object являются ссылочными типами, т.е. массивы string [] и object [] содержат ссылки на данные, а не сами данные.Ссылка имеет фиксированный размер (32 или 64 бита в зависимости от разрядности процесса).

...