2010-11-08 4 views
7

Как я могу объявить структуру с массивом фиксированного размера?Как я могу объявить массивы в структуре?

Я нашел решение, но оно работает только для примитивных типов данных. Мне нужен мой массив типа 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

Один подхода, чтобы сделать ваш Interop может быть закодировать сборки обертки в C++, который делает перевод на более C# -interop чистых структур.

+0

Кто-нибудь знает, почему допускаются только примитивные типы, а не каждый разрешимый тип? – CodesInChaos

+0

Просто угадывая: если вы разрешите конструкцию в вопросе, все члены каждого из этих Struct2-экземпляров также должны быть исправлены неявно. Таким образом, с несколькими уровнями гнездования у вас есть фиксированные предметы по всему месту, что даст сборщику мусора основную головную боль. – TToni

0

Вы не можете использовать пользовательские типы с фиксированными массивами. (Подробные сведения см. В разделе «Ответ TTonis»).

Вместо того, чтобы пытаться построить структуру на C# с определенным макетом памяти, я думаю, что вы должны использовать атрибут MarshalAs, чтобы указать, как члены должны быть упорядочены. Даже если вам удастся получить членов, занимающих нужный объем памяти, у вас все еще есть отступы между элементами, которые вызывают проблемы с выравниванием.

У вас может быть ссылка на обычный массив в структуре и указать, что он должен быть отсортирован как ByValArray.

Смежные вопросы