Массив в 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 хранит «мета» информацию для каждого элемента ...
А может я ошибся?
@JohnG, конечно, это не вызовет у меня исключения, пожалуйста, внимательно прочтите вопрос в следующий раз
@jdweng Я знаю, как работает размер типов в Unix. Вы пытаетесь ответить на другой вопрос. Пожалуйста, внимательно прочтите вопрос и в следующий раз.
Прочитал вопрос. Как вы думаете, почему C# отличается от языка C? Размер объекта должен быть определен. Вы сказали: «Массив в C# - это просто блок непрерывной памяти, как и в любом другом языке». Тогда утверждение: «Я знаю, как работает размер типов в Unix» - противоречие. Unix - это язык c, а не просто блоки памяти.





String и Object - это ссылочные типы, т.е. массивы string [] и object [] содержат ссылки на данные, а не сами данные.
Ссылка имеет фиксированный размер (32 или 64 бит в зависимости от архитектуры процессора).
Вы должны прочитать руководство по unix, в котором приведены структуры для стандартных типов. В unix необходимо определить размер структуры. Таким образом, для нестандартных объектов длина соответствует объекту, когда это необходимо. Строка заканчивается символом '\ n'. В сетевой библиотеке структуры (или классы) представляют собой не только блоки непрерывной памяти, но также содержат тип и размер (при необходимости). В C# есть анонимные (время выполнения) и неанонимные типы (которые определяются во время компиляции).