不安全结构中的只读数组字段
本文关键字:数组 字段 只读 结构 不安全 | 更新日期: 2023-09-27 18:27:23
这是原始声明:
[StructLayout(LayoutKind.Explicit, Size = 16)]
public unsafe struct X
{
[FieldOffset(0)] public ushort a;
[FieldOffset(2)] public fixed byte b[14];
};
我想将struct
设为只读,但我不知道该如何为数组编写getter。我唯一能想到的解决方案是getter方法:
[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]; } }
};
是否可以为b编写getter属性,而不是getter方法?
===更新===
我还想处理有多个数组字段的情况。例如:
[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]; } }
};
是否可以为b和c编写getter属性,而不是getter方法?我想写y.B[i]
和y.C[i]
而不是y.B(i)
和y.C(i)
。
您可以使用索引器属性访问特定索引处的数组。不幸的是,它需要在结构本身而不是B上定义,但这应该提供您想要的:
[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 this [int i]
{
get
{
byte b1;
fixed (byte* b2 = b)
{
b1 = b2[i];
}
return b1;
}
}
};
我找到了一个基于索引属性思想的解决方案:
[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct YB
{
[FieldOffset(0)] private fixed byte b[14];
public byte this[int i] { get { fixed (byte* p = b) { return p[i]; } } }
}
[StructLayout(LayoutKind.Explicit, Size = 8)]
public struct YC
{
[FieldOffset(0)] private fixed byte c[8];
public byte this[int i] { get { fixed (byte* p = c) { return p[i]; } } }
}
[StructLayout(LayoutKind.Explicit, Size = 24)]
public unsafe struct Y
{
[FieldOffset(0)] private ushort a;
[FieldOffset(2)] private YB b;
[FieldOffset(16)] private YC c;
public ushort A { get { return a; } }
public YB B { get { return b; } }
public YC C { get { return c; } }
};