2012-07-11 25 views
0

我目前在做結構上的一些閱讀和整個被帶屬性的使用結構的例子來。在這個例子中,使用的struct屬性是[FieldOffset(0)],它說確保這些字段存儲在同一塊內存中。的Structs與FieldOffsetValueAttribute

什麼優勢(S)或這個缺點(S)? 另外一個爲什麼要使用FieldOffsetAttribute把場存儲器的不同部分?

+0

根據http://msdn.microsoft.com/en-us/library/aa288471(v=vs.71).aspx:'這種對結構佈局的控制在使用平臺調用時很有用。「 – 2012-07-11 09:30:29

+1

http ://en.wikipedia.org/wiki/Union_%28computer_science%29 – 2012-07-11 09:32:08

+0

@AndreasNiedermair是的,但爲什麼? – CSharpened 2012-07-11 09:33:31

回答

2

這是用來控制在結構的成員的存儲器中的精確的偏移。當你想在P/Invoke調用的上下文中表示一個本地(C++)結構體時,它有時用在C#中。

在C#中沒有的東西,比如結構工會,所以你必須使用FieldOffsetValueAttribute

我建議你閱讀the following article

+0

偉大的鏈接。謝謝。 – CSharpened 2012-07-11 09:48:12

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())的方法涉及某種內存副本,這可能是一個大型數組的問題。