2010-11-08 88 views
7

我该如何声明具有固定大小数组的结构呢?我如何在struct中声明数组?

我找到了解决方案,但它只适用于原始数据类型。我需要我的阵列的类型为MyStruct

那么我怎么能声明一个结构与其他结构的数组呢?

ex。

unsafe struct Struct1{ 
     fixed int arrayInt[100]; // works properly 
     fixed Struct2 arrayStruct[100]; //not compile 
    } 

回答

9

我的同事找到了这样做的工作方式。我认为这是正确的方式。

[StructLayout(LayoutKind.Sequential)] 
    public struct Struct1 
    { 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = sizeOfarray)] 
      private Struct2[] arrayStruct; 
    } 
5

你不行。固定数组仅限于bool,byte,char,short,int,long,sbyte,ushort,uint,ulong,float或double。

http://msdn.microsoft.com/en-us/library/zycewsya%28v=VS.80%29.aspx

一种方法做你的互操作可能是C++编写的包装组件,其做翻译,以更加C#-interop友好的结构。

+0

有没有人知道为什么只有原始类型,而不是每个blittable类型都是允许的? – CodesInChaos 2010-11-08 12:16:12

+0

只是猜测:如果你允许问题中的构造,这些Struct2实例中的每一个的所有成员也必须隐式修复。所以有了几层嵌套,你已经在整个地方固定了项目,这会给垃圾收集器带来很大的麻烦。 – TToni 2010-11-08 12:57:29

0

您不能在固定数组中使用自定义类型。 (请参阅TTonis答案以了解详细信息。)

而不是试图用C#构造具有特定内存布局的结构,我认为应该使用MarshalAs属性来指定如何编组成员。即使您设法获取占用适当内存量的成员,仍然会在导致对齐问题的元素之间填充内容。

您可以在结构中引用常规数组,并指定将其编组为ByValArray