C#数组如何处理内存?

How C# Array works with memory?

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 存储每个元素的 'meta' 信息... 或许我错了?

StringObject 引用类型 ,即数组 string[] 和 object[] 包含对数据的引用,而不是数据本身.

引用具有固定大小(32 位或 64 位,具体取决于处理器架构)。