C#数组如何与内存一起工作?

C#数组如何与内存一起工作?,c#,.net,memory,low-level,C#,.net,Memory,Low Level,与其他语言一样,C#中的数组只是一块连续内存。 默认情况下,由于计算index*sizeof(T),在T[]处按索引操作获取元素将花费我们O(1)。但这只有在我们知道sizeof(T)的情况下才会起作用 所以我试着打破它: var sampleArray = new string[10]; sampleArray[0] = "1"; sampleArray[1] = "2"; var objectArray = (object[]) sampleArray; objectArray[2] =

与其他语言一样,C#中的数组只是一块连续内存。 默认情况下,由于计算
index*sizeof(T)
,在
T[]处按索引操作获取元素将花费我们O(1)。但这只有在我们知道
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”信息。。。
或者可能我错了?

String
Object
引用类型,即数组字符串[]和Object[]包含对数据的引用,而不是数据本身


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

您应该阅读unix手册,该手册提供了标准类型的结构。在unix中,结构的大小需要确定。因此,对于非标准对象,当需要时,长度将继续移动对象。字符串以“\n”结尾。在网络库中,结构(或类)不仅是连续内存块,还包含类型和大小(需要时)。c#有匿名(运行时)和非匿名类型(在编译时定义)。@JohnG当然不会抛出异常,请仔细阅读下面的问题time@jdweng我知道在Unix上如何处理类型的大小。你想回答另一个问题。请下次也仔细读这个问题。我读了这个问题。为什么你认为c语言和c语言有什么不同?物体的大小必须是确定的。你说过:“C#中的数组只是一块连续内存,就像其他语言一样。”。然后说“我知道如何在Unix上处理类型大小”是一个矛盾。Unix是c语言,它不仅仅是内存块。