2011-11-01 26 views
8

C# bir yapı türü sabit boyutlu diziyi bildirmek nasıl:Sabit Boyut Dizisi

bu CS1663 için sonuçlanacaktır
[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

: struct türündeki sabit boyut tamponları izin verilmez, nasıl I do Bu geçici çözüm, C# veya "Managed Collection veri yapısı" türünü kullanmamayı tercih ederim, çünkü bunu sıklıkla yerel C++

cevap

9

double. C# Eğer olması gerektiğidir struct yalnızca ilkel veri türlerini kullanır ve C++ içindeki yerel yapınızla tam olarak aynı düzende bulunur, bu kısıtlamaları manuel bellek m ile alabilirsiniz. anagement ve güvenli olmayan kod. Bonus olarak, marshalling'den kaçınarak performansı artıracaksınız.

bellek ayır:

IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256); 

Bu temelde malloc, yani tahsis bellek GC bilinci dışındadır.

IntPtr öğesini yerel koda MyStruct[256] gibi iletebilirsiniz ve yalnızca IntPtr işaretlenecek olan belleğe göre değil, sıralanır. Yerel ve yönetilen kod doğrudan aynı hafızaya erişebilir. Eğer bellek ile bittiğinde free için,

Marshal.FreeHGlobal (arr); 

unutmayın

static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    return *ptr; 
} 

static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    *ptr = value; 
} 

: okumak için

/C# işaretçileri kullanmak, C# Dizideki yapılar yazma o.

3

yapamazsınız; per the definition

tek sınırlama dizisi tip bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float veya

+0

hiçbir geçici çözüm yok mu? bunu C++ gibi yapabilir miyim? – uray

+0

@uray önerebileceğim tek şey düzenli bir dizidir. Eğer bu mümkün değilse, o zaman ... –