C#数组的元素大小?

时间:2013-06-02 19:04:58

标签: c# arrays size

如何在C#中检索个人 Array 元素大小

Int16[] a1 = new Int16[1024];
Int16[] a2 = new byte[1024];
Array array = ...  // (either a1 or a2)

int elementSizeInBytes = array.____?

sizeof不起作用,因为sizeof是编译时运算符 - 当然,sizeof(array)sizeof(array[0])甚至不编译。

获得元素数量非常简单:

int numElements = array.Length;

似乎没有返回元素大小的方法。然后它似乎可以从为数组/ array.Length分配的总空间中计算出来。但是如何获得Array实例使用的字节总大小并不明显。


示例用法:

问题是一般问题,但我正在尝试使用它的当前方法是将数组缓冲区的内容复制到WriteableBitmap:

private void copyPixels2Bitmap(Array pixels, WriteableBitmap bitmap)
{
    int elementSize = pixels.GetValue(0).GetType().___?;
    bitmap.WritePixels(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight), 
        pixels, bitmap.PixelWidth * elementSize, 0);
}

3 个答案:

答案 0 :(得分:2)

重写此方法以使用泛型。

private void copyPixels2Bitmap(Array pixels, WriteableBitmap bitmap)
{
    int elementSize = pixels.GetValue(0).GetType().___?;
    bitmap.WritePixels(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight), 
        pixels, bitmap.PixelWidth * elementSize, 0);
}

变为:

private void CopyPixelsToBitmap<T>(T[] pixels, WriteableBitmap bitmap)
  where T: struct
{
    var elementSize = Marshal.SizeOf(typeof(T));
    bitmap.WritePixels(new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight), 
        pixels, bitmap.PixelWidth * elementSize, 0);

}

适用于任何值类型。

答案 1 :(得分:1)

Int16 [] array = new Int16 [1024];

这意味着您在内存中分配1024 * 16bits空间,实际上意味着数组的每个元素最多可以达到2 ^ 16 - 1。 如果您正在寻找占用的内存空间,可以使用sizeof

答案 2 :(得分:1)

这是我到目前为止找到的最佳方式:

int elementSize = System.Runtime.InteropServices.Marshal.SizeOf(pixels.GetValue(0));