2010-11-08 69 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