2011-11-01 29 views
8

làm thế nào để khai báo mảng kích thước cố định của một loại cấu trúc trong C#:Fixed Size mảng của kiểu cấu

[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

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

điều này sẽ dẫn đến CS1663: cố định bộ đệm kích thước của cấu trúc kiểu không được cho phép, làm cách nào để workaround này ?, Tôi không thích sử dụng C# hoặc "Managed Collection data structure" loại, vì tôi cần phải thường xuyên marshall này để bản địa C++

Trả lời

9

Nếu bạn C# struct chỉ sử dụng các kiểu dữ liệu nguyên thủy và có bố cục chính xác như cấu trúc gốc của bạn trong C++, bạn có thể gặp các hạn chế này với bộ nhớ thủ công m anagement và mã không an toàn. Như một phần thưởng, bạn sẽ cải thiện hiệu suất bằng cách tránh marshalling.

Phân bổ bộ nhớ:

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

này về cơ bản là malloc, vì vậy các cấp phát bộ nhớ nằm ngoài nhận thức của GC.

Bạn có thể chuyển IntPtr tới mã gốc như thể nó là MyStruct[256] và chỉ IntPtr sẽ được sắp xếp lại, chứ không phải bộ nhớ mà nó trỏ tới. Mã nguồn gốc và được quản lý có thể truy cập trực tiếp vào cùng một bộ nhớ.

Để đọc/ghi các cấu trúc trong mảng với C#, sử dụng C con trỏ #:

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; 
} 

Đừng quên

Marshal.FreeHGlobal (arr); 

khi bạn đang thực hiện với bộ nhớ, để free nó.

3

Bạn không thể; per the definition

Hạn chế duy nhất là kiểu mảng phải bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, hoặc double.

+0

không có giải pháp nào khác? vì vậy tôi có thể làm điều này như trong C + +? – uray

+0

@uray điều duy nhất tôi có thể đề xuất là một mảng thông thường. Nếu điều đó là không thể, thì ... –