c# - 在 C# 中转换数组

标签 c# arrays casting

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

虽然不要尝试调试它... One of the reasons why this is evil:

关于c# - 在 C# 中转换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25080946/

相关文章:

php - 从 mysql 中类型转换数字数据在 PHP 中不起作用

c# - 如何在 ASP.NET Core 中使用模型验证来验证所需的查询字符串字段

c++ - 如何将可变大小的静态数组设置为用 0 填充

python - Python 中 ND 数组的“删除”命令

arrays - PostgreSQL 索引 JSONB 数组

mysql - SELECT * 但也使用 CAST()

java - 如何在 Android 中动态转换类的实例

c# - 使用 C# 获取解决方案文件的父文件夹的路径

c# - 调度程序不执行作业,似乎甚至没有注册它

c# - Google Plus LoadFriends 失败