2

在 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);
}
4

3 回答 3

3

重写此方法以使用泛型。

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);

}

适用于任何值类型。

于 2013-06-03T03:17:26.840 回答
3

这是迄今为止我发现的最好的方法:

int elementSize = System.Runtime.InteropServices.Marshal.SizeOf(pixels.GetValue(0));
于 2013-06-03T00:44:51.157 回答
1

Int16[] 数组 = 新的 Int16[1024];

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

于 2013-06-02T19:16:41.293 回答