在 C# 中,我正在处理大量值类型。我希望能够转换兼容值类型的数组,例如:
struct Color
{
public byte R, G, B, A;
}
Color[] bitmap1 = ...;
uint[] bitmap2 = MagicCast(bitmap1);
我希望 bitmap2 与 bitmap1 共享内存(它们具有相同的位表示)。我不想复制。
有办法吗?
最佳答案
您可以通过使用 Structlayouts 覆盖两个数组来实现这一点。 虽然这里的许多答案都写了如何使颜色结构也具有 uint,但这是关于“数组”转换的:
这是邪恶的。
public static class ColorExtension
{
public static uint[] GetUInts(this Color[] colors)
{
if(colors == null) throw new ArgumentNullException("colors");
Evil e = new Evil { Colors = colors};
return e.UInts;
}
[StructLayout(LayoutKind.Explicit)]
struct Evil
{
[FieldOffset(0)]
public Color[] Colors;
[FieldOffset(0)]
public uint[] UInts;
}
}
这基本上有两个数组引用相同的内存位置。
所以如果你想从颜色数组中获取单位数组,你可以这样做:
Color[] colors = ...
uint[] uints = colors.GetUInts();
如评论中所述,您可能还需要显式声明 colorstruct,否则运行时可能会弄乱顺序导致一些“奇怪的”uint 值...
[StructLayout(LayoutKind.Sequential)] // Or explicit, but i bellieve Sequential is enough.
struct Color
{
public byte R;
public byte G;
public byte B;
public byte A;
}
虽然不要尝试调试它...
关于c# - 在 C# 中转换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25080946/