Это оригинальное заявление:поля только для чтения массива в небезопасных структурах
[StructLayout(LayoutKind.Explicit, Size = 16)]
public unsafe struct X
{
[FieldOffset(0)] public ushort a;
[FieldOffset(2)] public fixed byte b[14];
};
Я хотел бы сделать struct
только для чтения, но я не знаю, как я должен написать геттер для массива , Единственное решение, которое я мог бы выяснить, является добытчик метод:
[StructLayout(LayoutKind.Explicit, Size = 16)]
public unsafe struct X
{
[FieldOffset(0)] private ushort a;
[FieldOffset(2)] private fixed byte b[14];
public ushort A { get { return a; } }
public byte B(int i) { fixed (byte* p = b) { return p[i]; } }
};
Можно ли написать геттер свойство для Ь вместо метода геттер ?
=== UPDATE ===
Я также хотел бы, чтобы обработать случай, когда есть более одного поля массива. Например:
[StructLayout(LayoutKind.Explicit, Size = 24)]
public unsafe struct Y
{
[FieldOffset(0)] private ushort a;
[FieldOffset(2)] private fixed byte b[14];
[FieldOffset(16)] private fixed byte c[8];
public ushort A { get { return a; } }
public byte B(int i) { fixed (byte* p = b) { return p[i]; } }
public byte C(int i) { fixed (byte* p = c) { return p[i]; } }
};
Можно ли написать геттер свойства для Б и вместо того, чтобы геттер методы? Я хотел бы написать y.B[i]
и y.C[i]
вместо y.B(i)
и y.C(i)
.
Вы всегда должны использовать объявление, подобное этому, для неуправляемого взаимодействия с кодом. В этот момент член структуры, доступный только для чтения, больше ничего не значит. Язык, с которым вы взаимодействуете, требует объявления таким образом, возможно, с * const *. –
@HansPassant Да, мне нужно это для кода interop. У меня есть байт * от сторонней неуправляемой библиотеки, и после добавления смещения я передал его указателям на похожие небезопасные структуры. Я просто хочу (1) остановить пользователей моего кода, перезаписывая исходные неуправляемые данные, и (2) изменить некоторые поля внутри получателя. Поэтому я сделал каждое поле частным и добавил геттеры. – kol
Никогда не подвергайте ненадежные структуры клиентскому коду. Это небезопасно, и никто не любит включать этот вариант. –