假设我们先前已经从D类实例化了三个对象A,B,C 现在一个数组定义如下: D [] arr = new D [3]; ARR [0] = A; ARR [1] = B; ARR [2] = C;
数组是否包含对象的引用或具有单独的副本?
答案 0 :(得分:5)
引用类型数组仅包含引用。
在32位应用程序中,引用是32位(4字节),在64位应用程序中,引用是64位(8字节)。因此,您可以通过将数组长度乘以参考大小来计算近似大小。 (对于数组类,内部变量还有一些额外的字节,一些额外的字节用于内存管理。)
答案 1 :(得分:3)
C#区分引用类型和值类型。
使用类一词声明引用类型。这些类型的变量包含引用,因此数组将是对象的引用数组。每个引用都是4个字节(在32位系统上)或8个字节(在64位系统上)大。
使用 struct 一词声明值类型。每次分配时都会复制此类型的值。值类型的数组包含值的副本,因此数组的大小是struct的大小乘以元素的数量。
通常当我们说“对象”时,我们引用引用类型的实例,所以你的问题的答案是“是”,但要记住差异,并确保你没有不小心创建了一个大型结构的大型数组。
答案 2 :(得分:2)
您可以使用WinDBG + SOS(或PSSCOR2)查看数组占用的内存。 IIRC,一系列引用类型在内存中以其长度表示,然后是对其元素的引用,即它的确切大小为PLATFORM_POINTER_SIZE * (array.Length + 1)
答案 3 :(得分:0)
该数组由指向对象的指针(32位或64位)组成。对象是引用类型,只有值类型被复制到数组本身。
答案 4 :(得分:0)
正如@Yves所说它有对象的引用。该数组是一个内存块,就像在C中一样。 所以它的大小是sizeof(元素)* count + oop所需的内存量。