0

我有一个Dictionary<key,dataValue>. 问题是它dataValue可以是 int、float、vector2、vector3、byte、short、uint 或 bool 类型。我想避免装箱,所以我不能让 dataValue 成为一个对象。

我可以创建一个可以将任何数据类型存储在同一字节数组中的数据类型(类或结构)吗?数据类型中的枚举将保存类型(int,float,bool ...),以便我们知道如何解释字节数组中的数据?

编辑:代码可能不安全。

[StructLayout(LayoutKind.Explicit)]
    struct TestUnion 
{
    [FieldOffset(0)] 
    public int i;
    [FieldOffset(0)] 
    public double d;
    [FieldOffset(0)] 
    public char c;
    [FieldOffset(0)] 
    public byte b1;
}

像这样的东西会起作用吗?

4

1 回答 1

2

您可以使用 StructLayout(LayoutKind.Explicit) 和 FieldOffset 属性来创建等效功能。我假设您的意思是 64 位数据结构,其中包含 8 个字节或 2 个整数。如果您确实是指 64 字节的数据结构,则需要定义一个 64 字节和 16 个整数的结构。(使用 byte[] 和 int[] 可能更好。)您可以在此处找到信息:

http://winfx.msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_csref/html/163ab9b5-46f6-4d78-9025-f7bbba89b2e1.asp

例如:

using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct ByteArray {
  [FieldOffset(0)]
  public byte Byte1;
  [FieldOffset(1)]
  public byte Byte2;
  [FieldOffset(2)]
  public byte Byte3;
  [FieldOffset(3)]
  public byte Byte4;
  [FieldOffset(4)]
  public byte Byte5;
  [FieldOffset(5)]
  public byte Byte6;
  [FieldOffset(6)]
  public byte Byte7;
  [FieldOffset(7)]
  public byte Byte8;
  [FieldOffset(0)]
  public int Int1;
  [FieldOffset(4)]
  public int Int2;
}

如果您计划在可能具有不同字节序的非 x86 平台上运行机器,需要注意的一件事是机器的字节序。有关解释,请参见http://en.wikipedia.org/wiki/Endianness 。

于 2013-08-15T16:54:36.393 回答