struct - array元素的数组是引用还是值类型?

时间:2011-08-16 13:41:59

标签: c#

C#如何处理struct数组 - 我是否需要分配每个数组元素(好像它是一个类对象数组)?

示例:

public struct RGBA { public byte red, green, blue, alpha; }

public RGBA [] colorBuffer = new RGBA [1024*1024];

现在colorBuffer是一个指向RGBA对象的指针数组,我是否必须分配它们,例如像这样:

for (int i = 0; i < colorBuffer.Length; i++)
    colorBuffer [i] = new RGBA ();

或者colorBuffer指向一个4 MB大小的内存块,包含1 MB RGBA结构吗?

4 个答案:

答案 0 :(得分:8)

colorBuffer变量值将是数组对象的引用。数组对象本身将是一个对象,大小为4MB(4字节* 1024 * 1024)。数组是引用类型,但每个元素都是值类型。元素值 RGBA值 - 它不是指针。

对于每个元素,数组将自动初始化为default(RGBA),您是否不需要执行自己的初始化。

如果你这样做:

RGBA[] other = colorBuffer;

只是复制引用 - 这两个变量现在引用相同的数组。

答案 1 :(得分:1)

结构总是值类型。如果创建1024 * 1024个项目的数组,则所需内存为(1024 * 1024)*(1 + 1 + 1 + 1)+ some_overhead_of_array。

答案 2 :(得分:1)

C#中的数组是引用类型,即使它的基础类型是值类型。

答案 3 :(得分:1)

这种情况下的数组元素是值类型。它们不需要使用new创建。例如,以下代码将编译并执行正常:

void Main()
{
    var colorBuffer = new RGBA [10];
    for (int i = 0; i < colorBuffer.Length; i++)
    {
        colorBuffer[i].red = (byte)i;
        Console.WriteLine(colorBuffer[i].red);
    }
}

struct RGBA { public byte red, green, blue, alpha; }