使用FieldOffsetValueAttribute的结构

时间:2012-07-11 09:24:55

标签: c# attributes struct

我目前正在对结构进行一些阅读,并且遇到了与属性一起使用的结构的示例。在示例中,正在使用的struct属性是[FieldOffset(0)],它说它确保字段存储在同一块内存中。

这有什么优点或缺点? 另外为什么要使用FieldOffsetAttribute将字段放在内存的不同部分?

2 个答案:

答案 0 :(得分:2)

这用于控制结构成员在内存中的确切偏移量。当您想要在P/Invoke调用的上下文中表示本机(C ++)结构时,它有时会在C#中使用。

在C#中没有诸如结构联合之类的东西,所以你必须使用FieldOffsetValueAttribute

我建议你阅读the following article

答案 1 :(得分:1)

我已经看到这个技巧在某个地方使用了,这将改变数组的基础类型,从uint到int,而不复制数组的元素:

[StructLayout(LayoutKind.Explicit)]
struct ArrayTypeChanger
{
    [FieldOffset(0)]
    public int[] ArrayOfInts;

    [FieldOffset(0)]
    public uint[] ArrayOfUInts;
}

以及某种类型改变方法:

public static int[] ChangeArayType(uint[] input)
{
    return new ArrayTypeChanger { ArrayOfUInts = input }.ArrayOfInts;
}

没有内存被复制,这应该会非常快。当然,它仅在类型具有相同大小(sizeof(uint)== sizeof(int))时才有效。 不确定MS推荐这个......

更改此类数组类型的其他方法(如Marshal.Copy())会包含某种内存副本,这可能是大型数组的问题。